Web框架之Django:
请给做者点赞 —> 原文连接
(1)简介:
(2)Django的处理流程:
- 当用户发出HTTP请求,URLhandler接收用户请求,根据开发人员设置的路由规则匹配相应的处理类 根据请求的类型判断调用的HTTP方法
- 若是须要链接数据库,Views中的函数将会调用Models的方法,不然直接去Template中取出HTML页面直接返回
- 调用Models的时候,Models会去数据库读取数据再返回给Views
- 通过渲染页面一块儿将最终的HTML页面返回给页面
☆MTV与MVC:
MTV和MVC的思想是同样的的,只是思想的体现有所不一样。javascript
MVC:M管理应用程序的状态,并约束改变状态的行为,通常叫作业务规则;V负责把数据格式化后呈现给用户查看;C接收用户操做,根据访问模型获取数据,并调用视图显示这些数据,控制器(处理器)用于将模型与视图隔离并成为两者之间的联系纽带。html
MTV:M表明数据存取层,也就是Model,改为处理与数据相关的全部事务如何存取,如何验证数据的有效性,包含哪些行为与数据相关;T指的是表现层,该层处理与现实相关的行为,如何在页面文档中显示数据,展示内容,也就是Template;V表明业务逻辑层,该层包含存取模型及调取恰当模板的相关逻辑。java
☆Django版的MTV:
Django也是一个MVC框架。可是在Django中,控制器接受用户输入的部分由框架自行处理,因此 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。node
☆Django设计MVC优美哲学:
1.对象关系映射 (ORM,object-relational mapping):python
2.URL 分派:mysql
3.模版系统:jquery
4.表单处理:git
5.Cache系统:web
6.会话(session):ajax
7.国际化:
8.自动化的管理界面(Model):
(3)Django的经常使用命令:
建立程序
- django-admin startproject sitename # 在当前目录下建立一个Django程序
启动服务器
- python manage.py runserver ip:port # 启动服务器,默认是127.0.0.1:8000
建立APP
- python manage.py startapp appname # 建立APP
同步数据库
- python manage.py syncdb# 同步数据库,Django 1.7及以上版本须要用如下的
建立数据配置文件
- python manage.py makemigrations # 建立数据配置文件,显示并记录全部数据的改动
建立表结构
- python manage.py migrate #建立表结构,将改动更新到数据库
建立超级管理员
- python manage.py createsuperuser # 建立超级管理员
启动命令行模式
- python manage.py dbshell # 数据库命令行
查看命令列表
- python manage.py # 查看命令列表
(4)Django数据库相关:
☆默认使用SQLite3数据库的配置:
☆MySQL的配置:
导入 PyMySQL模块
因为Python开发经常使用Python3.x,Django链接数据库的时候使用的是MySQL的MySQLdb模块,然而在Python3中尚未此模块,所以须要使用pymysql进行代替,下面的配置代码写入到项目目录的init.py中便可:
☆PostgreSQL数据库的配置:
☆Oracle数据库的配置:
Django框架对于开发者而言高度透明化,对于不一样数据库的具体使用方法是一致的,改变数据库类型只须要变更上述配置便可。
☆Django中的Model数据库操做:
Django提供了一个抽象层(“Model”)来构建和管理Web应用程序的数据。Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。关系对象映射(Object Relational Mapping,简称ORM)。
建立Django项目后的目录结构:
★建立基本表结构:
# file:models.py
执行命令: python manage.py makemigrations
执行命令:python manage.py migrate
可视化以下:
其余的字段参数:
- null = True # 数据库字段是否能够为空
- blank = True # django的 Admin 中添加数据时是否可容许空值
- primary_key = False # 主键,对AutoField设置主键后,就会代替原来的自增 id 列
- auto_now # 自动建立,不管添加或修改,都是当前操做的时间
- auto_now_add # 自动建立永远是建立时的时间
- 选择:
- max_length # 长度,是CharField必须属性
- default # 默认值
- verbose_name # Admin中字段的显示名称
- name|db_column # 数据库中的字段名称
- unique = True # 不容许重复
- db_index = True # 数据库索引
- editable = True # 在Admin中是否能够编辑
- error_messages = None # 错误提示
- auto_created = False # 自动建立
16.help_text # 在Admin中提示帮助信息
- validators = []
- *upload-to**
其余的字段:
1. models.AutoField
- 自增列,int类型,若是没有设置,默认会生成一个名称为id的列,若是要显示一个自定义的自增列,必须将其设置为主键
2. models.CharField
- 字符串字段,必须设置max_length属性
3. models.BooleanField
- 布尔类型,在数据库中的类型使用tinyint类型构造实现,不能为空
4. models.ComaSeparatedIntegerField
- 用逗号分割的数字,在数据库中是varchar类型,继承自CharField,因此必须 max_lenght 属性
5. models.DateField
- 日期类型,在数据库中对应date类型,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次建立添加,以后的更新再也不改变。
6. models.DateTimeField
- 日期类型,在数据库中对应datetime,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次建立添加,以后的更新再也不改变。
7. models.Decimal
- 十进制小数类型,在数据库中对应decimal类型,必须指定整数位max_digits和小数位decimal_places
8. models.EmailField
- 字符串类型(正则表达式邮箱),在数据库中对应varchar类型
9. models.FloatField
- 浮点类型,在数据库中对应double类型
10. models.IntegerField
- 整型,在数据库中对应int类型
11. models.BigIntegerField
- 长整形
- models.IPAddressField
- 字符串类型(ip4正则表达式)
- models.GenericIPAddressField
- 字符串类型(ip4和ip6是可选的),参数protocol能够是:both、ipv四、ipv6,验证时,会根据设置报错
- models.NullBooleanField
- 容许为空的布尔类型
- models.PositiveIntegerFiel
- 正数范围的Integer
- models.PositiveSmallIntegerField
- 正数范围的smallInteger
- models.SlugField
- 减号、下划线、字母、数字
- models.SmallIntegerField
- 数字,数据库中的字段有:tinyint、smallint、int、bigint
- models.TextField
- 字符串,在数据库中对应longtext
- models.TimeField
- 时间 HH:MM[:ss[.uuuuuu]]
- models.URLField
- 字符串,地址正则表达式
- models.BinaryField
- 二进制
24.models.ImageField
- 图片
- models.FilePathField
- 文件
元数据:
- db_table = ‘TableName’ # 数据库中生成的名称,使用app名称+下划线+类名
- index_tohether = [(‘pub_date’,’deadline’)] # 联合索引
- unique_together = ((‘drive’,’ restaurant’)) # 联合惟一索引
- verbose_name admin中显示的名称
触发Model中的验证和错误提示有两种方式:
- DjangoAdmin中的错误信息会优先根据Admin内部的ModelForm错误信息提示,若是都成功,才会再验证Model的字段并显示指定的错误信息。
更改Admin中的错误提示:
- 调用Model对象的clean_fields方法:
★连表操做:
一对多:models.ForeignKey(其余表)
多对多:models.ManyToManyField(其余表)
一对一:models.OneToOneField(其余表)
1. 一对多:
2. 一对一:
3. 多对多:
★表的增删改查:
1.对数据进行增长数据:
1.1也能够直接传入字典建立:
2. 删除数据:
3.修改数据:
4.查询数据:
★使用双下划线链接操做:
1.获取个数:
2.比较大小:
3.是否包含:
4.是否为空:
5.contains:
6. range范围:
7.其余的操做:
8. order by:
9. group by:
10. limit 、offset:
11. regex正则匹配,iregex 不区分大小写:
12.日期:
13.年月日周时分秒:
14.extra:
extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None),有些状况下,Django的查询语法难以简单的表达复杂的 WHERE 子句,对于这种状况, Django 提供了 extra() QuerySet 修改机制,它能在 QuerySet生成的SQL从句中注入新子句。不管什么时候你都须要很是当心的使用extra(). 每次使用它时,您都应该转义用户可使用params控制的任何参数,以防止SQL注入攻击。因为产品差别的缘由,这些自定义的查询难以保障在不一样的数据库之间兼容(由于你手写 SQL 代码的缘由),并且违背了 DRY 原则,因此如非必要,仍是尽可能避免写 extra。
★F和Q:
from django.db.models import F
models.Tb1.objects.update(num=F('num')+1) #F用于拿到原始数据
# ##方式一:
# ##方式二:
★执行原生SQL:
★利用双下划线和 _set 将表之间的操做链接起来:
2.一对一操做:
3.一对多操做:
# 正向查找一对多
# 反向查找一对多
4.多对多操做:
# 添加数据
#group_obj.user_info.add(user_info_obj) \#group_obj.user_info.add(*user_info_objs)
# 删除数据
# 添加数据
# 删除数据
# 获取数据
# 获取数据
# 添加多对多
(5)Django路由系统:
Django的路由系统本质就是URL正则与调用的视图函数之间的映射表,URL的加载是从配置中开始的。
这样Django也就很好的支持了静态路由,基于正则的动态路由,以及二级路由,一样开发人员也能够自行使用基于请求方法的路由。
参数是可选的要传递给视图函数的默认参数(字典形式)
别名也是可选的
例如:
其余使用正则的例子:
说明:
- 要捕获从URL中的值,用括号括起来,会当参数传入 views 视图。
- 没有必要添加一个斜线,由于每一个URL都有。例如,它articles不是/articles。
- 在'r'前面的每一个正则表达式字符串中是可选的,但建议。它告诉Python字符串是“原始” -没有什么字符串中应该进行转义。
使用正则分组:
Django的二级路由示例:
须要注意的是,当你加上参数时,对应函数views.year_archive必须加上一个参数,参数名也必须命名为 foo,这样就实现了参数名的静态绑定,放置参数顺序出错。
(6)Django的View视图函数:
HTTP中产生的两大对象:
- HTTP请求:HttpRequest
- HTTP应答:HttpResponse
☆HttpRequest对象:
当请求一个HTML页面的时候,Django将会建立一个HttpRequest对象包含原数据的请求,而后Django加载适合的视图,经过HTTPRequest做为视图函数的一地个参数。每一个视图负责返回一个HttpResponse响应。
HttpRequest对象的属性:
- path:请求页面的全路径,不包括域名
- method:请求中使用的HTTP方法的字符串表示。全大写表示。例如
GET: 包含全部HTTP GET参数的类字典对象
POST:包含全部HTTP POST参数的类字典对象
服务器收到空的POST请求的状况也是可能发生的,也就是说,表单form经过HTTP POST方法提交请求,可是表单中可能没有数据,所以不能使用if req.POST来判断是否使用了HTTP POST 方法;应该使用if req.method=="POST"。
COOKIES:
- *包含全部cookies的标准Python字典对象;keys和values都是字符串。**
FILES:
- 包含全部上传文件的类字典对象;FILES中的每个Key都是标签中 name属性的值,FILES中的每个value同时也是一个标准的python字典对象,包含下面三个Keys:
- filename:上传文件名,用字符串表示
- content_type:上传文件的Content Type
- content:上传文件的原始内容
5. user:
是一个django.contrib.auth.models.User对象,表明当前登录的用户。若是访问用户当前没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。能够经过user的is_authenticated()方法来辨别用户是否登录:
6. session:
- 惟一可读写的属性,表明当前会话的字典对象;本身有激活Django中session支持时该属性才可用。
7. META:
一个标准的Python字典包含全部可用的HTTP头。可用标题取决于客户端和服务器,一些例子:
☆HttpResponse对象属性:
对于HtppResponse对象来讲,是由Django自动建立的牡丹石HTTPResponse对象必须开发人员手动建立,每一个View请求处理方法必须返回一个HTTPResponse对象。
HTTPResponse对象经常使用的方法:
- 页面渲染,render,render_to_response,推荐使用render,由于render功能更为强大。
- 页面跳转,redirect
- 页面传参,locals,能够直接将对应视图中的全部变量所有传递给模板。
- 示例代码:
对于render的:
结合给定的模板与一个给定的上下文,返回一个字典HttpResponse在渲染文本对象。
- request和template_name是必须参数,request指的是传来的resquest,template_name指的是HTML模板或模板序列的名称,若是给定的是序列,那么序列中的第一个模板将被引用。
- context 一组字典的值添加到模板中。默认状况下,这是一个空的字典。
- content_type MIME类型用于生成文档。
- status 为响应状态代码。默认值为200
- using 这个名字一个模板引擎的使用将模板。
(7)Django模板和模板语言:
要使用模板,必然会牵扯到静态文件的配置,好比CSS,Js等,在Django的项目目录中的settings.py中追加:
其中static是存放静态文件的目录,这样就能在HTML页面中引用特效或者图片了。对于模板,其实就是读取模板,模板中嵌套着标签,而后渲染数据的时候,从Model中取出数据插入到模板中,最后用户接收到请求的响应。
模板语言:
继承:
其余经常使用方法:
在字典中取出数据使用dict.some的形式
自定义标签:
由于在模板语言中不能进行逻辑运算,因此在Django中提供两种自定义的标签,
- 一种是simple_tag,
- 另外一种是filter。
simple_tag能够传递任意参数,可是不能用做布尔判断,filter最多只能传递2个参数,能够用作布尔判断,一样的,simple_tag和filter的实现是相似的。
示例代码:
在HTML文件中导入以前建立的Python文件,使用load命令:
使用simple_tag:
须要在项目目录中的settings.py中配置当前的APP:
(8)Django的中间件:
中间件示意图:
每一次用户的请求都会一层一层穿过中间件,当不符合中间件的业务逻辑的时候就会直接返回,用户请求到达不了最里层的业务逻辑处理函数,这样能够自定义中间件,在不使用Nginx等第三方工具的时候统计每次用户的访问次数。
中间件其实就是一个Python文件,可是其中的类须要继承自
from django.utils.deprecation import MiddlewareMixin
,
在这个文件中能够建立以下5中函数:
# 请求到来以前执行
# 数据返回以前执行
# 执行view中的方法以前执行
# 程序出错时执行
# 渲染模板数据时执行
须要在项目目录中的settings.py文件中设置: