django内容总结
一、django请求的生命周期
1、django请求生命周期如图所示
2、django本身没有socket,客户端请求先到达wsgi然后再提交给django,而wsgi的本质就是个socket程序
注释 wsji协议是通过调用wsgiref或uwsgi模块来实现socket的
二、FBV和CBV
1、FBV
function base view, 一个URL路径对应一个视图函数
2、CBV
class base view, 一个URL路径对应一个视图下的类
3、FBV设置方法
略
4、CBV设置方法
1、设置URL格式
注释:对应的类名后必须添加.as_view(),标准格式记住就可以了。
2、在view中设置class类
注释:设置类时必须先导入一个View模块,然后继承该模块。在该类中先执行父类View中的dispatch方法,然后通过反射判断如果以get请求发送数据自动执行get下的方法,如果以post请求发送数据自动执行post下的方法。
3、在父类View中的dispatch方法
注释:由于父类中的displaced方法使用了lower()吧字符串转小写的方法所有类下的函数名都是小写。getattr()反射原理意思就是说get请求对应class下的get函数,然后handler()就是执行类下该函数然后返回结果。
4、自己手动编写一个dispatch方法
注释:由于手动编写直接返回一个"ok"所有不再执行下面的get和post方法
5、CBV利用dispatch处理数据顺序实现用户登陆验证(相当于添加了个装饰器)
注释:cbv中先执行dispatch再执行get和post最后再执行dispatch然后吧结果发送出去,所有可以在执行get或post之前做一层用户验证是否登陆
# request.GET 获取GET请求体中的信息
# request.POST 获取POST请求体中的信息 请求方式是由客户端的请求头中的:content-type决定的
# request.body 获取body的信息,GET或POST中的信息是由body中的原始信息转换来的
6、通过类继承的方法实现5中的需求
7、通过类多继承的方式来实现5中需求
注释:类继承的执行顺序:从左到右
8、通过装饰器方式来实现5中需求
装饰器方式1:在每个类下的函数前添加装饰器
装饰器方式2:直接在dispatch函数上添加装饰器
装饰器方式3:直接在类中添加装饰器,用来修饰某个特定的函数
总结:全局设置或者局部设置都要三思而后行
在服务器端通过装饰器取消csrf_token验证(先导入from django.views.decorators.csrf import csrf_exempt,csrf_protect)
1.csrf_exempt取消post方式提交的csrf_token验证
注释:只要把该装饰器设置在类下的dispatch函数上才会生效,必须的没理由
2.csrf_protect取消get方式提交的csrf_token验证
如上图,略
9、客户端请求方式( restful规范就是潜规则的意思)
1、get请求方式:一般是获取数据的时候使用
2、post请求方式:一般是提交数据的时候使用
3、put请求方式:一般是全局更新数据的时候使用
4、patch请求方式:一般是局部更新数据的时候使用
5、delete请求方式:一般是删除数据的时候使用
注释:form表单提交数据只支持get和post方式
ajax提交数据支持get, post, put, patch, delete, head, options, trace等方式
三、django中间件
1、如图所示:
注释:django中间键其实就是由类组成,每一个类就是一个中间键。而每一个类里面都可以有五个方法。
2、方法1(process_request方法) 和方法2(process_response方法):
注释:图一方法直接导入模块然后在模块中创建类进行引用,但是适用于旧版本的Django,新版本的Django建议使用图二方法,直接把 MiddlewareMixin模板中的MiddlewareMixin类方法复制过来就可以了。
1、process_request 可以有返回值也可以没有返回值
当有返回值时也就是说有return值时执行的流程,如图所示:
注释:绿色部分为正常流程,而红色部分为当process_request有return返回值的时候就会不走下面的步骤了直接走对应的process_response步骤即直接执行当前中间件和上方中间件的process_response。
利用该知识点设置用户cookie授权验证,如果未授权则url自动跳转至登录页面,但是必须注意的时现在的中间键必须添加在csrf_taken之后否则没有经过csrf就会被拦截返回,一直陷入死循环并且必须设置登录页面的路径可以正常通过。
2、process_response 必须要有返回值也就是说必须要有return值,否则报错,原理如图所示:
注释:process_reques1 》》process_request2》》process_request3。。。。 view tem 》》。。。》》process_response3》》process_response2》》process_response1。由此可得出在视图函数中返回的response数据可用和用户接受到的response数据不一致那是因为response数据传输到中间键时可能会被修改。比如响应头信息就是在中间键的时候添加上去的。
3、方法3(process_view方法):
1、process_view 在成功路由匹配后而在执行view视图函数之前执行的代码,该函数可以有返回值也可没有返回值。
2、执行流程1(没返回值时的执行流程)
注释:先执行process_request然后再执行process_view然后再执行view tem最后执行process_response3
3、执行流程2(有返回值时的执行流程)
4、方法4(process_exception):
1、process_exception 该函数是在程序代码出现内部错误返回错误信息时才会执行的函数,该函数必须要有返回值否则无意义,默认是不会被执行的
2、执行流程
注释:先执行process_request然后再执行process_view然后再执行view tem然后再执行process_exception最后执行process_response3
5、方法5(process_template_response())
1、process_template_response(self,request,response) 该函数默认不会被执行但是如果返回的结果中有render方法就会被执行且必须有return返回值。
6、Django内部中间键
注释:该中间键的作用就是检测用户传输数据是否有csrf_token键值对,如果有则通过否则403错误
可以到CsrfViewMiddleware模块中查看中间键的使用方法
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。