Django基础皖心

框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

importsocketdefhandle_request(client):buf=client.recv(1024)client.send("HTTP/1.1200OK\r\n\r\n".encode("utf8"))client.send("Hello,yuan".encode("utf8"))defmain():sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.bind(('localhost',8001))sock.listen(5)whileTrue:connection,address=sock.accept()handle_request(connection)connection.close()if__name__=='__main__':main()ViewCode

最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

这个接口就是WSGI:WebServerGatewayInterface。

-----------------------------Doawebframeworkourselves---------------------------

print(environ['PATH_INFO'])path=environ['PATH_INFO']start_response('200OK',[('Content-Type','text/html')])f1=open("index1.html","rb")data1=f1.read()f2=open("index2.html","rb")data2=f2.read()ifpath=="/yuan":return[data1]elifpath=="/alex":return[data2]else:return["

404

".encode('utf8')]ViewCodestep3

Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:

Model(模型):负责业务对象与数据库的对象(ORM)

Template(模版):负责如何把页面展示给用户

View(视图):负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

1、创建一个djangoproject

当前目录下会生成mysite的工程,目录结构如下:

2、在mysite目录下创建应用,比如blog:

3、启动django项目

4、同步更改数据库表或字段

5、清空数据库

此命令会询问是yes还是no,选择yes会把数据全部清空掉,只留下空表。

6、创建超级管理员

这个命令和直接运行python进入shell的区别是:你可以在这个shell里面调用当前项目的models.py中的API,对于操作数据的测试非常方便。

8、Django项目环境终端

ythonmanage.pydbshellDjango会自动进入在settings.py中设置的数据库,如果是MySQL或postgreSQL,会要求输入数据库用户密码。

在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。

9、更多命令

查看所有的命令,忘记子名称的时候特别有用。

10static配置

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL中的值并以位置参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL中的值并以关键字参数传递给视图。

在Python正则表达式中,命名正则表达式组的语法是(Ppattern),其中name是组的名称,pattern是要匹配的模式。

下面是以上URLconf使用命名组的重写:

/articles/2005/03/请求将调用views.month_archive(request,year='2005',month='03')函数/articles/2003/03/03/请求将调用函数views.article_detail(request,year='2003',month='03',day='03')。在实际应用中,这意味你的URLconf会更加明晰且不容易产生参数顺序问题的错误——你可以在你的视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价;有些开发人员认为命名组语法丑陋而繁琐。

URLconf在请求的URL上查找,将它当做一个普通的Python字符串。不包括GET和POST参数以及域名。

URLconf不检查请求的方法。换句话讲,所有的请求方法——同一个URL的POST、GET、HEAD等等——都将路由到相同的函数。

每个捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf中:

url(r'^articles/(P[0-9]{4})/$',views.year_archive),views.year_archive()的year参数将是一个字符串

有一个方便的小技巧是指定视图参数的默认值。下面是一个URLconf和视图的示例:

django.conf.urls.url()函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

例如:

fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns=[url(r'^blog/(P[0-9]{4})/$',views.year_archive,{'foo':'bar'}),]在这个例子中,对于/blog/2005/请求,Django将调用views.year_archive(request,year='2005',foo='bar')。

这个技术在Syndication框架中使用,来传递元数据和选项给视图。

urlpatterns=[url(r'^index',views.index,name='INDEX'),]###################defindex(req):ifreq.method=='POST':username=req.POST.get('username')password=req.POST.get('password')ifusername=='alex'andpassword=='123':returnHttpResponse("登陆成功")returnrender(req,'index.html')#####################Title{##}用户名:密码:#######################'''复制代码ViewCode

一个视图函数,或者简短来说叫做视图,是一个简单的Python函数,它接受web请求,并且返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片...是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了能够把代码放在某个地方,惯例是把视图放在叫做views.py的文件中,然后把它放到你的项目或者应用目录里。

defcurrent_datetime(request):now=datetime.datetime.now()html="Itisnow%s."%nowreturnHttpResponse(html)尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。让我们来看一下为什么:

基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统(TemplateSystem)来实现这种模式,这就是本章要具体讨论的问题。

python的模板:HTML代码+逻辑控制代码

fromdjango.shortcutsimportrender,HttpResponsefromdjango.template.loaderimportget_template#记得导入#Createyourviewshere.importdatetimefromdjango.templateimportTemplate,Context#defcurrent_time(req):#原始的视图函数#now=datetime.datetime.now()#html="现在时刻:

%s.

"%now#returnHttpResponse(html)#defcurrent_time(req):#django模板修改的视图函数#now=datetime.datetime.now()#t=Template('现在时刻是:{{current_date}}')#t=get_template('current_datetime.html')#c=Context({'current_date':now})#html=t.render(c)#returnHttpResponse(html)#另一种写法(推荐)defcurrent_time(req):now=datetime.datetime.now()returnrender(req,'current_datetime.html',{'current_date':now})ViewCode4.2.2深度变量的查找(万能的句点号)在到目前为止的例子中,我们通过context传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。在Django模板中遍历复杂数据结构的关键是句点字符(.)。

语法格式:{%tags%}{%if%}的使用{%if%}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{%if%}和{%endif%}间的所有内容

引用路由配置的地址

{%csrf_token%}{%with%}用更简单的变量名替代复杂的变量名

{%withtotal=fhjsaldfhjsdfhlasdfhljsdal%}{{total}}{%endwith%}{%verbatim%}禁止render

{%verbatim%}{{hello}}{%endverbatim%}{%load%}略

a、在app中创建templatetags模块(必须的)

b、创建任意.py文件,如:my_tags.py

fromdjangoimporttemplatefromdjango.utils.safestringimportmark_saferegister=template.Library()#register的名字是固定的,不可改变@register.filterdeffilter_multi(v1,v2):returnv1*v2@register.simple_tagdefsimple_tag_multi(v1,v2):returnv1*v2@register.simple_tagdefmy_input(id,arg):result=""%(id,arg,)returnmark_safe(result)复制代码ViewCodec、在使用自定义simple_tag和filter的html文件中导入之前创建的my_tags.py:{%loadmy_tags%}

d、使用simple_tag和filter(如何调用)

-------------------------------.html{%loadxxx%}#首行#num=12{{num|filter_multi:2}}#24{{num|filter_multi:"[22,333,4444]"}}{%simple_tag_multi25%}参数不限,但不能放在iffor语句中{%simple_tag_multinum5%}

e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

注意:

filter可以用在if等语句后,simple_tag不可以

{%ifnum|filter_multi:30>100%}{{num|filter_multi:30}}{%endif%}extend模板继承到目前为止,我们的模板范例都只是些零星的HTML片段,但在实际应用中,你将用Django模板系统来创建整个HTML页面。这就带来一个常见的Web开发问题:在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?Django解决此类问题的首选方法是使用一种优雅的策略——模板继承。

本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

让我们通过修改current_datetime.html文件,为current_datetime创建一个更加完整的模板来体会一下这种做法:

第一步是定义基础模板,该框架之后将由子模板所继承。以下是我们目前所讲述范例的基础模板:

{%blocktitle%}{%endblock%}

Myhelpfultimestampsite

{%blockcontent%}{%endblock%}{%blockfooter%}

Thanksforvisitingmysite.

{%endblock%}这个叫做base.html的模板定义了一个简单的HTML框架文档,我们将在本站点的所有页面中使用。子模板的作用就是重载、添加或保留那些块的内容。(如果你一直按顺序学习到这里,保存这个文件到你的template目录下,命名为base.html.)

我们使用模板标签:{%block%}。所有的{%block%}标签告诉模板引擎,子模板可以重载这些部分。每个{%block%}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖。

现在我们已经有了一个基本模板,我们可以修改current_datetime.html模板来使用它:

以下是其工作方式:

在加载current_datetime.html模板时,模板引擎发现了{%extends%}标签,注意到该模板是一个子模板。模板引擎立即装载其父模板,即本例中的base.html。此时,模板引擎注意到base.html中的三个{%block%}标签,并用子模板的内容替换这些block。因此,引擎将会使用我们在{blocktitle%}中定义的标题,对{%blockcontent%}也是如此。所以,网页标题一块将由{%blocktitle%}替换,同样地,网页的内容一块将由{%blockcontent%}替换。

注意由于子模板并没有定义footer块,模板系统将使用在父模板中定义的值。父模板{%block%}标签中的内容总是被当作一条退路。继承并不会影响到模板的上下文。换句话说,任何处在继承树上的模板都可以访问到你传到模板中的每一个模板变量。你可以根据需要使用任意多的继承次数。使用继承的一种常见方式是下面的三层法:

<1>创建base.html模板,在其中定义站点的主要外观感受。这些都是不常修改甚至从不修改的部分。<2>为网站的每个区域创建base_SECTION.html模板(例如,base_photos.html和base_forum.html)。这些模板对base.html进行拓展,并包含区域特定的风格与设计。<3>为每种类型的页面创建独立的模板,例如论坛页面或者图片库。这些模板拓展相应的区域模板。这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作。

以下是使用模板继承的一些诀窍:

django默认使用sqlite的数据库,默认自带sqlite的数据库驱动,引擎名称:django.db.backends.sqlite3

<2>mysql

引擎名称:django.db.backends.mysql

如果我们想要更改数据库,需要修改如下:

DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'books',#你的数据库名称'USER':'root',#你的数据库用户名'PASSWORD':'',#你的数据库密码'HOST':'',#你的数据库主机,留空默认为localhost'PORT':'3306',#你的数据库端口}}注意:

复制代码NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:nomodulenamedMySQLdb这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL所以,我们只需要找到项目名文件下的__init__,在里面写入:importpymysqlpymysql.install_as_MySQLdb()问题解决!ViewCode

5.2ORM表模型

实例:我们来假定下面这些概念,字段和关系

作者模型:一个作者有姓名。

作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。

出版商模型:出版商有名称,地址,所在城市,省,国家和网站。

书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。

<1>每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。

<2>每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。

<3>模型之间的三种关系:一对一,一对多,多对多。

一对一:实质就是在主外键(author_id就是foreignkey)的关系基础上,给外键加了一个UNIQUE=True的属性;

一对多:就是主外键关系;(foreignkey)

多对多:(ManyToManyField)自动创建第三张表(当然我们也可以自己创建第三张表:两个foreignkey)

实例:

<1>第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。

<2>在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。而某些情况下,我们只需要更新行里的某几列。

此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

注意,这里因为update返回的是一个整形,所以没法用query属性;对于每次创建一个对象,想显示对应的rawsql,需要在settings加上日志记录部分:

QuerySet特点:

<1>可迭代的

<2>可切片

<1>aggregate(*args,**kwargs):

通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。

fromdjango.db.modelsimportAvg,Min,Sum,Max从整个查询集生成统计值。比如,你想要计算所有在售书的平均价钱。Django的查询语法提供了一种方式描述所有图书的集合。>>>Book.objects.all().aggregate(Avg('price')){'price__avg':34.35}aggregate()子句的参数描述了我们想要计算的聚合值,在这个例子中,是Book模型中price字段的平均值aggregate()是QuerySet的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它:>>>Book.objects.aggregate(average_price=Avg('price')){'average_price':34.35}如果你也想知道所有图书价格的最大值和最小值,可以这样查询:>>>Book.objects.aggregate(Avg('price'),Max('price'),Min('price')){'price__avg':34.35,'price__max':Decimal('81.20'),'price__min':Decimal('12.99')}ViewCode<2>annotate(*args,**kwargs):

可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

查询alex出的书总价格

查询各个作者出的书的总价格,这里就涉及到分组了,分组条件是authors__name

查询各个出版社最便宜的书价是多少

仅仅靠单一的关键字参数查询已经很难满足查询要求。此时Django为我们提供了F和Q查询:

如果你觉得英文界面不好用,可以在setting.py文件中修改以下选项

THE END
1.71找最贵的书和最便宜的书77-1 找最贵的书和最便宜的书 作者sy 宁波财经学院 给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。 输入格式: 输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样https://blog.csdn.net/weixin_66794831/article/details/130731738
2.2024最新马来西亚租房攻略(租房流程+途径+租房网站/App+价格+注意没有家具(Unfurnished)的房子:租金最便宜的,但也是最不方便的,因为屋主通常只提供最基本的橱柜、沙发和桌子等家具而已,有的甚至只是一间空房。 Step 3:开始找房 你可以找中介帮你物色合适的房子,经验丰富的房地产经纪绝对可以为你争取到最好的交易条件,并且能在最大程度维护你的利益。当然你也可以自己找,找房源https://www.extrabux.cn/chs/guide/7175043
3.寄50斤书籍,怎么用最便宜的邮寄方式?要用邮局普通包裹,挂号费3元,每斤资费1.05元,邮寄50斤共52.5元,要用邮局普通快包,挂号费3元邮寄50斤,大概105元左右。依据地区间的距离不同每公斤0.8-5.0元不等。要注意的是音像制品等怕碎怕摔物的价格高。去邮局柜台要包裹单填好交费即可。https://zhidao.baidu.com/question/721649833167447845.html
4.豆瓣评分最高的书100本必读书单好好收藏充实自己作者:徐仁修 著 豆瓣评分:9.8 推荐理由: 1,“徐仁修荒野游踪·写给大自然的情书”是徐仁修为关爱自然的人士所写的荒野故事书,是风靡华人世界的“自然文学”经典。在写作形式上,集自然探险、博物学、文学、生态摄影于一身,是诗与思的完美结合,科普与艺术的完美结合。它们关心的是与每个中国人的幸福息息相关的大问题https://www.douban.com/note/719054447/#sep
5.商业策划书范文2000字精选9篇出国留学网栏目推荐你阅读“商业策划书”等专题内容。 商业策划书范文【篇1】 一、活动目的和背景 本次房地产开盘活动初定时间为20xx年6月19日,星期六。从20xx年度至今年五月份在亿万酒店项目的推广,再加上5月下旬开始的媒体推广到现在,太极景润花园在市场上已经具有一定的知名度,通过媒体推广和销售接待,客户群对https://www.liuxue86.com/a/4820931.html
6.考生问答1.大连科技学院学费是多少? 答:2022年我校本科普通类学生学费每学年2.6-2.7万元;艺术类专业学生学费每学年2.8万元;专升本学生学费每学年2.7万元,高职(专科)学生学费每学年1.8万元。 2.大连科技学院寝室费是多少? 答:1—4号楼每学年住宿费为3000元,5—7号楼每学年住宿费为3500元. 3.大连科技学院书费是多少https://sub2.dlust.edu.cn/kjzs/channel-101.html
7.山寮诗行(莫一般)1 目录 5 花开一季何曾了(渔家傲) 6 冬枣(卜算子) 7 红叶(卜算子) 8 雪梅(卜算子) 9雪(卜算子) 10 胡杨(卜算子) 11 雄安七姐妹(卜算子) 12 赠祥隶大师蒋克学先生(卜算子) 13 毛泽东(卜算子) 14 酒(卜算子) 15 雪莲(卜算子) 16 庐山瀑布(卜算子) https://www.meipian.cn/21r9oe6r