一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来。
一个软件框架是由其中各个软件模块组成的,每一个模块都有特定的功能,模块与模块之间通过相互配合来完成软件的开发。
软件框架是针对某一类软件设计问题而产生的。
MVC最初是由施乐公司旗下的帕罗奥多研究中心中的一位研究人员给smalltalk语言发明的一中软件设计模式。
MVC的产生理念:分工。让专门的人去做专门的事。
MVC的核心思想:解耦。
MVC的思想被应用在的web开发的方面,产生了webMVC框架。
通过浏览器注册用户信息。
M:Model,模型,和数据库进行交互。
V:View,视图,产生html页面。
C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答。
Django是劳伦斯出版集团的开发人员为开发新闻内容网站而设计出来的一个软件,它遵循MVC思想,但是有自己的一个名词,叫做MVT。
Django遵循快速开发和DRY原则。Donotrepeatyourself.不要自己去重复一些工作。
M:Model,模型,和MVC中M功能相同,和数据库进行交互。
V:View,视图,和MVC中C功能相同,接收请求,进行处理,与M和T进行交互,返回应答。
T:Template,模板,和MVC中V功能相同,产生html页面。
之前安装python包的命令:sudopip3install包名
包的安装路径:/usr/local/lib/python3.5/dist-packages
在同一个python环境中安装同一个包的不同版本,后安装的包会把原来安装的包覆盖掉。这样,如果同一台机器上两个项目依赖于相同包的不同版本,则会导致一些项目运行失败。
解决的方案就是:虚拟环境。
虚拟环境是真实python环境的复制版本。
在虚拟环境中使用的python是复制的python,安装python包也是安装在复制的python中。
安装虚拟环境的命令:
3)编辑家目录下面的.bashrc文件,添加下面两行。
exportWORKON_HOME=$HOME/.virtualenvsexportVIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'#exportVIRTUALENVWRAPPER_VIRTUALENV=~/virtualenvsexportVIRTUALENVWRAPPER_VIRTUALENV=~/.local/bin/virtualenvsource/usr/local/bin/virtualenvwrapper.sh4)使用source.bashrc使其生效一下。
创建虚拟环境命令:
mkvirtualenv虚拟环境名
创建python3虚拟环境:
mkvirtualenv-ppython3bj11_py3
进入虚拟环境工作:
workon虚拟环境名
查看机器上有多少个虚拟环境:
workon空格+两个tab键
退出虚拟环境:
deactivate
删除虚拟环境:
rmvirtualenv虚拟环境名
虚拟环境下安装包的命令:
pipinstall包名
注意:不能使用sudopipinstall包名,这个命令会把包安装到真实的主机环境上而不是安装到虚拟环境中。
查看虚拟环境中安装了哪些python包:
piplistpipfreeze
安装django环境:
pipinstalldjango==3.2.6
拓展:
apt-getinstall软件
pipinstallpython包名
命令:
django-adminstartproject项目名
注意:创建应用必须先进入虚拟环境。
项目目录如下:
一个项目由很多个应用组成的,每一个应用完成一个功能模块。
创建应用的命令如下:
pythonmanage.pystartapp应用名
注意:创建应用时需要先进入项目目录。
应用目录如下:
建立应用和项目之间的联系,需要对应用进行注册。
修改settings.py中的INSTALLED_APPS配置项。
运行开发web服务器命令:
pythonmanage.pyrunserver
django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作。
在Django中主要是设计类:模型类。
ORM另外一个作用:根据设计的类生成数据库中的表。
在应用models.py中设计模型类。
必须继承与models.Model类。
Models.ForeignKey可以建立两个模型类之间一对多的关系,django在生成表的时候,就会在多端的表中创建一列作为外键,建立两个表之间一对多的关系。
进入项目shell的命令:
pythonmanage.pyshell
以下为在相互shell终端中演示的例子:
首先导入模型类:
frombooktest.modelsimportBookInfo,HeroInfo
b=BookInfo.objects.get(id=2)b.heroinfo_set.all()#查询出b图书中所有英雄人物的信息7.后台管理语言和时区的本地化。
修改settings.py文件。
命令:pythonmanage.pycreatesuperuser
在应用下的admin.py中注册模型类。
告诉djang框架根据注册的模型类来生成对应表管理页面。
b=BookInfo()str(b)__str__自定义模型管理类。模型管理类就是告诉django在生成的管理页面上显示哪些内容。
在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容。
视图函数定义在views.py中。
例:
defindex(request):#进行处理...returnHttpResponse('hellopython')视图函数必须有一个参数request,进行处理之后,需要返回一个HttpResponse的类对象,hellopython就是返回给浏览器显示的内容。
url配置的目的是让建立url和视图函数的对应关系。url配置项定义在urlpatterns的列表中,每一个配置项都调用url函数。
url函数有两个参数,第一个参数是一个正则表达式,第二个是对应的处理动作。
配置url时,有两种语法格式:
工作中在配置url时,首先在项目的urls.py文件中添加配置项时,并不写具体的url和视图函数之间的对应关系,而是包含具体应用的urls.py文件,在应用的urls.py文件中写url和视图函数的对应关系。
在项目的urls.py文件中包含具体应用的urls.py文件,应用的urls.py文件中写url和视图函数的对应关系。
模板不仅仅是一个html文件。
编码之前的准备工作:
以下为案例中的简单设计过程:
O(objects):类和对象。
R(Relation):关系,关系数据库中的表格。
M(Mapping):映射。
DjangoORM框架的功能:
修改settings.py中的DATABASES。
需要安装操作mysql数据库的包,python2环境和python3环境有以下区别。
pipinstallmysql-python
pipinstallpymysql
python3中安装好pymysql,需要在test2/init.py中加如下内容:
页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址。
遍历显示出每一本图书的信息并增加新建和删除超链接。
属性名=models.字段类型(选项)
使用时需要引入django.db.models包,字段类型如下:
通过选项实现对字段的约束,选项如下:
对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。
经验:
当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移,商品的选项中default和blank不影响表结构。
参考文档:
mysql.log是mysql的日志文件,里面记录的对MySQL数据库的操作记录。默认情况下mysql的日志文件没有产生,需要修改mysql的配置文件,步骤如下:
sudovi/etc/mysql/mysql.conf.d/mysqld.cnf
sudoservicemysqlrestart
/var/log/mysql/mysql.log是mysql日志文件所在的位置。
使用下面的命令可以实时查看mysql的日志文件:
sudotail-f/var/log/mysql/mysql.log
通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。
get示例:
例:查询图书id为3的图书信息。
all方法示例:
例:查询图书所有信息。
filter方法示例:
条件格式:
模型类属性名__条件名=值
a)判等条件名:exact
例:查询编号为1的图书。#Djangomodels语法BookInfo.objects.get(id=1)b)模糊查询
例:查询书名包含’传’的图书。contains
BookInfo.objects.filter(btitle__contains='传')例:查询书名以’部’结尾的图书endswith开头:startswith
BookInfo.objects.filter(btitle__endswith='部')c)空查询isnull
例:查询书名不为空的图书。isnullselect*frombooktest_bookinfowherebtitleisnotnull;#Djangomodels语法BookInfo.objects.filter(btitle__isnull=False)d)范围查询in
例:查询id为1或3或5的图书。select*frombooktest_bookinfowhereidin(1,3,5);#Djangomodels语法BookInfo.objects.filter(id__in=[1,3,5])e)比较查询gt(greatethan)lt(lessthan)gte(equal)大于等于
lte小于等于
例:查询id大于3的图书。Select*frombooktest_bookinfowhereid>3;#Djangomodels语法BookInfo.objects.filter(id__gt=3)f)日期查询
#例:查询1980年发表的图书。BookInfo.objects.filter(bpub_date__year=1980)#例:查询1980年1月1日后发表的图书。fromdatetimeimportdateBookInfo.objects.filter(bpub_date__gt=date(1980,1,1))exclude方法示例:
#例:查询id不为3的图书信息。BookInfo.objects.exclude(id=3)order_by方法示例:
作用:进行查询结果进行排序。
#例:查询所有图书的信息,按照id从小到大进行排序。BookInfo.objects.all().order_by('id')#例:查询所有图书的信息,按照id从大到小进行排序。BookInfo.objects.all().order_by('-id')#例:把id大于3的图书信息按阅读量从大到小排序显示。BookInfo.objects.filter(id__gt=3).order_by('-bread')6.F对象作用:用于类属性之间的比较。
使用之前需要先导入:
fromdjango.db.modelsimportQ#例:查询id大于3且阅读量大于30的图书的信息。BookInfo.objects.filter(id__gt=3,bread__gt=30)BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))#例:查询id大于3或者阅读量大于30的图书的信息。BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))#例:查询id不等于3图书的信息。BookInfo.objects.filter(~Q(id=3))8.聚合函数作用:对查询结果进行聚合操作。
sumcountavgmaxmin
aggregate:调用这个函数来使用聚合。返回值是一个字典
使用前需先导入聚合类:
fromdjango.db.modelsimportSum,Count,Max,Min,Avg#例:查询所有图书的数目。BookInfo.objects.all().aggregate(Count('id')){'id__count':5}#例:查询所有图书阅读量的总和。BookInfo.objects.aggregate(Sum('bread')){'bread__sum':126}count函数返回值是一个数字
作用:统计满足条件数据的数目。
#例:统计所有图书的数目。BookInfo.objects.all().count()BookInfo.objects.count()#例:统计id大于3的所有图书的数目。BookInfo.objects.filter(id__gt=3).count()小结:
all:返回模型类对应表的所有数据,返回值是Oueryset。
filter:返回满足条件的数据,返回值是Oueryset,参数可以写查询条件。
exclude:返回不满足条件的数据,返回值是Oueryset,参数可以写查询条件。
order_by:对查询结果进行排序,返回值是Queryset,参数中写排序的字段。
注意:
fromdjango.db.modelsimportF,Q,Sum,Count,Avg,Max,Min
F对象:用于类属性之间的比较。Q对象:用于条件之间的逻辑关系。
aggregate:进行聚合操作,返回值是一个字典,进行聚合的时候需要先导入聚合类。count:返回结果集中数据的数目,返回值是一个数字。
注意:对一个Oueryset实例对象,可以继续调用上面的所有函数。
参考文档:
all,filter,exclude,order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。
可以对一个查询集进行取下标或者切片操作来限制查询集的结果。
对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。
取出查询集第一条数据的两种方式:
exists:判断一个查询集中是否有数据。TrueFalse
例:图书类-英雄类
models.ForeignKey()定义在多的类中。
例:新闻类-新闻类型类体育新闻国际新闻
models.ManyToManyField()定义在哪个类中都可以。
例:员工基本信息类-员工详细信息类.员工工号
models.OneToOneField定义在哪个类中都可以。
在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。
#例:查询id为1的图书关联的英雄的信息。b=BookInfo.objects.get(id=1)b.heroinfo_set.all()通过模型类查询:
HeroInfo.objects.filter(hbook__id=1)#例:查询id为1的英雄关联的图书信息。h=HeroInfo.objects.get(id=1)h.hbook通过模型类查询:
由一类的对象查询多类的时候:
一类的对象.多类名小写_set.all()#查询所用数据
由多类的对象查询一类的时候:
多类的对象.关联属性#查询多类的对象对应的一类的对象
由多类的对象查询一类对象的id时候:
多类的对象.关联属性_id
例:查询图书信息,要求图书关联的英雄的描述包含’八’。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)例:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)12.入、更新和删除调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新。
调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除。
自关联是一种特殊的一对多的关系。
案例:显示广州市的上级地区和下级地区。
地区表:id,atitle,aParent_id;
mysql终端中批量执行sql语句:
sourceareas.sql;14.管理器BookInfo.objects.all()->objects是一个什么东西呢?
答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。
Django默认生成的表名:
应用名小写_模型类名小写。
元选项:
需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。
接收请求,进行处理,与M和T进行交互,返回应答。
返回html内容HttpResponse,也可能重定向redirect,还可以返回json数据。
404:找不到页面,关闭调试模式之后,默认会显示一个标准的错误页面,如果要显示自定义的页面,则需要的templates目录下面自定义一个404.html文件。
500:服务器端的错误。
网站开发完成需要关闭调试模式,在settings.py文件中:
DEBUG=False
ALLOWED_HOST=[‘*’]
进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数。
异步的javascript。在不全部加载某一个页面部的情况下,对页面进行局的刷新,ajax请求都在后台。
图片,css文件,js文件都是静态文件。
cookie是由服务器生成,存储在浏览器端的一小段文本信息。
cookie的特点:
记住用户名案例:
session存储在服务器端。
session的特点:
cookie:记住用户名。安全性要求不高。
session:涉及到安全性要求比较高的数据。银行卡账户,密码
产生html,控制页面上展示的内容。模板文件不仅仅是一个html文件。
模板文件包含两部分内容:
通常是在视图函数中使用模板产生html内容返回给客户端。
模板语言简称为DTL。(DjangoTemplateLanguage)
模板变量名是由数字,字母,下划线和点组成的,不能以下划线开头。
使用模板变量:{{模板变量名}}
模板变量的解析顺序:
例如:{{book.btitle}}
如果解析失败,则产生内容时用空字符串填充模板变量。
使用模板变量时,.前面的可能是一个字典,可能是一个对象,还可能是一个列表。
{%代码段%}for循环:{%forxin列表%}#列表不为空时执行{%empty%}#列表为空时执行{%endfor%}可以通过{{forloop.counter}}得到for循环遍历到了第几次。{%if条件%}{%elif条件%}{%else%}{%endif%}关系比较操作符:><>=<===!=
注意:进行比较操作时,比较操作符两边必须有空格。
逻辑运算:notandor
过滤器用于对模板变量进行操作。
date:改变日期的显示格式。
length:求长度。字符串,列表.
default:设置模板变量的默认值。
格式:模板变量|过滤器:参数
自定义过滤器。
自定义的过滤器函数,至少有一个参数,最多两个
参考资料:(模板标签和内置过滤器)
单行注释:{#注释内容#}
多行注释:
在父模板里可以定义块,使用标签:
{%block块名%}块中间可以写内容,也可以不写{%endblock块名%}子模板去继承父模板之后,可以重写父模板中的某一块的内容。
继承格式:{%extends父模板文件路径%}
{%block块名%}
{{block.super}}#获取父模板中块的默认内容
重写的内容
{%endblock块名%}
编辑商品详情信息,数据表中保存的是html内容。
在模板上下文中的html标记默认是会被转义的。
小于号<转换为<大于号>转换为>单引号'转换为'双引号"转换为"与符号&转换为&要关闭模板上下文字符串的转义:可以使用{{模板变量|safe}}
{%autoescapeoff%}模板语言代码{%endautoescape%}模板硬编码中的字符串默认不会经过转义,如果需要转义,那需要手动进行转义。
加功能:
案例流程图:
django防止csrf的方式:
防御原理:
当某一个url配置的地址发生变化时,页面上使用反向解析生成地址的位置不需要发生变化。
根据url正则表达式的配置动态的生成url。
在项目urls中包含具体应用的urls文件时指定namespace;
urlpatterns-[url(r'^admin/',include(admin.site.urls)),#包含应用的urls文件 url(r'^',include('booktest.urls'),namespace='booktest'),]在应用的urls中配置是指定name;
urlpatterns-[url(r'^index1/$',views.index1,name='index1'),url(r'^index2/$',views.index2,name='index2'),]在模板文件中使用时,格式如下:{%url'namespace名字:name'%}例如{%url'booktest:fan2'%}带位置参数:{%url'namespace名字:name'参数%}例如{%url'booktest:fan2'1%}带关键字参数:{%url'namespace名字:name'关键字参数%}例如{%url'booktest:fan2'id=1%}在重定向的时候使用反向解析:fromdjango.core.urlresolversimportreverse无参数:reverse('namespace名字:name名字')如果有位置参数reverse('namespace名字:name名字',args=位置参数元组)如果有关键字参数reverse('namespace名字:name名字',kwargs=字典)Django其他技术其他技术1.静态文件1.1使用在网页使用的css文件,js文件和图片叫做静态文件。
STATIC_URL='/static/'STATICFILES_DIRS=[BASE_DIR/'static']STATIC_ROOT="/home/zic/桌面/singleBlog/singleBlog/static"STATIC_URL设置访问静态文件对应的url。
STATICFILES_DIRS设置静态文件所在的物理目录。
动态生成静态文件的路径。
中间件函数是django框架给我们预留的函数接口,让我们可以干预请求和应答的过程。
使用request对象的META属性:request.META[‘REMOTE_ADDR’]
在类中定义中间件预留函数。init:服务器响应第一个请求的时候调用。process_request:是在产生request对象,进行url匹配之前调用。process_view:是url匹配之后,调用视图函数之前。process_response:视图函数调用之后,内容返回给浏览器之前。process_exception:视图函数出现异常,会调用这个函数。如果注册的多个中间件类中包含process_exception函数的时候,调用的顺序跟注册的顺序是相反的。
商品销售网站。
FILE_UPLOAD_HANDLERS=("django.core.files.uploadhandler.MemoryFileUploadHandler","django.core.files.uploadhandler.TemporaryFileUploadHandler")上传图片参考资料:
查询出所有省级地区的信息,显示在页面上。
areaInfo.objects.filter(aParent__isnull=True)fromdjango.core.paginatorimportPaginatorpaginator=Paginator(areas,10)#按每页10条数据进行分页