django中间件是django的门户(自带7个中间件)
1请求来的时候需要先经过中间件才能到达真正的django后端
2响应走的时候最后也需要经过中间件才能发送出去
django请求生命周期,浏览器——Web服务网关接口(wsgiref、uwsgi)——django后端(django中间件-urls-views-models-database)
django支持自定义中间件且暴露给程序员五个可以自定义的方法
1必须掌握
process_request
process_response
2了解即可
process_view
process_template_response
process_exception
9.2如何自定义中间件
1在项目名或应用名下创建一个任意名称的文件夹
2在该文件夹内创建一个任意名称的py文件
3在该py文件内书写一个类(必须继承MiddlewareMixin)
然后这个类中就可以自定义五个方法了(并不需要全部书写,用几个写几个)
4需要将类的途径以字符串的形式注册到配置文件中才能生效
mydd.py
#-8-coding=utf-8-*-#
Time:/5/:43#File:mydd.py#Software:PyCharmfromdjango.shortcutsimportHttpResponse,render,redirectfromdjango.utils.deprecationimportMiddlewareMixinclassMyMiddleWare1(MiddlewareMixin):defprocess_request(self,request):print(我是第一个自定义中间件里的process_request方法)classMyMiddleWare2(MiddlewareMixin):defprocess_request(self,request):print(我是第二个自定义中间件里的process_request方法)views.py
defmiddleware_index(request):print(我是视图函数的index)returnHttpResponse(index)
settings.py中MIDDLEWARE列表中再添加
#注册自定义中间件(在应用下创建路径有提示,在项目中创建没有提示,需要自己比对着书写)app01.mymiddleware.mydd.MyMiddleWare2,app01.mymiddleware.mydd.MyMiddleWare1,
运行浏览器输入相关网址后端返回有
在classMyMiddleWare1中添加以下代码returnHttpResponse(我是第一个自定义中间件里的request方法返回的数据)
则前端有
后端有
process_request
1请求来的时候需要经过每一个中间件里面的process_request方法,结果的顺序是按照配置文件中注册中间件的顺序从上到下依次执行
2如果中间件里没有定义该方法,则直接跳过执行下一个中间件
3如果该方法返回了HTTPResponse对象,则请求将不再继续往后执行,而是直接原路返回(相当于校验失败,不允许访问)
process_request方法就是用来做全局相关的所有限制功能
在两个类中添加
defprocess_reponse(self,request,response):""":paramresponse:django客户端返回给浏览器的内容"""print(我是第一个自定义中间件里的process_response方法)returnresponse
后端并没有打印出print里面的内容
process_response
1响应走的时候需要经过每一个中间件里面的process_response方法,该方法有request和response两个参数
2该方法必须返回一个HTTPResponse对象
默认返回的是形参response
也可以自定义
3顺序是按注册顺序从上到下,如果没有定义,直接跳过执行下一个
研究如果在第一个process_request方法就已经返回了HttpResponse对象,则响应走的时候是经过所有中间件里的process_response还是其他情况
是其他情况
会直接走同级别的process_response返回
flask框架也有一个中间件,当它只要返回了数据就必须经过所有中间件里的类似于process_response方法
2了解即可
process_view
路由匹配成功之后执行视图函数之前,会自动执行中间件中的此方法,顺序如上
process_template_response
返回的HTTPResponse对象有render属性时才会触发,顺序是从下往上(基本不用)
后端:views.py
#触发中间件中process_template_response方法defmiddleware_index(request):print(我是视图函数的index)obj=HttpResponse(index)defrender():print(内部render)returnHttpResponse(o98k)obj.render=renderreturnobj
process_exception
当视图函数中出现异常是触发,顺序从下往上
mydd.py,在两个类中继续添加defprocess_view(self,request,view_name,*args,**kwargs):print(view_name,*args,**kwargs)print(我是第一个自定义中间件里的process_view方法)defprocess_template_response(self,request,response):print(我是第一个自定义中间件里的process_template_response方法)returnresponsedefprocess_exception(self,request,exception):print(我是第一个自定义中间件里的process_exception方法)print(exception)
执行之后前端输出
后端输出
二,csrf校验9.3csrf跨站请求伪造钓鱼网站有关
内部本质:
在钓鱼网站页面针对对方账户只给用户提供一个没有name属性的普通input框,然后在内部隐藏一个已经写好name和value的input框。
正经网站前端:
h1我是正儿八经的网站/h1formaction=""method="post"pusername:inputtype="text"name="username"/pptarget_user:inputtype="text"name="target_user"/ppmoney:inputtype="text"name="money"/pinputtype="submit"class="btnbtn-info"/form
后端:
defcsrf_transfer(request):ifrequest.method==POST:username=request.POST.get(username)target_user=request.POST.get(target_user)money=request.POST.get(money)print(f"{username}给{target_user}转了{money}元")returnrender(request,csrf_transfer.html)
钓鱼网站前端:
h1我是钓鱼网站/h1formaction="