Django——中间件及用法
1.django内置中间件
# 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能 # django内置中间件 \'django.middleware.security.SecurityMiddleware\', \'django.contrib.sessions.middleware.SessionMiddleware\',#注释之后就拿不到request.session了 \'django.middleware.common.CommonMiddleware\',#重定向 \'django.middleware.csrf.CsrfViewMiddleware\',#注释之后发post请求会被禁止 \'django.contrib.auth.middleware.AuthenticationMiddleware\',#如果\'django.contrib.sessions.middleware.SessionMiddleware\'注释了,那这个也要注释,不然会报错 \'django.contrib.messages.middleware.MessageMiddleware\', \'django.middleware.clickjacking.XFrameOptionsMiddleware\',
2.自定义中间件
1 自定义步骤: -写一个类,继承MiddlewareMixin -里面写方法process_request(请求来了,一定会触发它的执行) -在setting中配置(注意,放在前和放在后) MIDDLEWARE = [ ... \'app01.mymiddle.MyMiddleware1\', ... ]
3.自定义中间件 代码
#settings.py 略 #urls.py 略 #mymiddle.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了\') return response #views.py from django.shortcuts import render,HttpResponse,redirect def index(request): print(\'我是视图函数\') return HttpResponse(\'ok\')
4.中间件需要知道的用法
process_request,process_response,process_view,process_exception
1 process_request(request对象) 2 process_response(request对象,response对象) \'\'\' 如这个网址:127.0.0.1/user/... 加cookie name=lili 利用process_request 和process_response 因为已经有request对象了,先用request.get_full_path()取到所有路径, 判断路径如果是127.0.0.1/user/...就加上cookie,用reponse.set_cookie(\'name\',\'lili\')不是就不做处理 \'\'\' 3 多个中间件,执行顺序是什么?(!!!记得写好中间件) -请求来的时候从上往下执行:process_request -请求走的时候,从下往上执行:process_response 4 process_request可以干什么? -写一个中间件,不管前端用什么编码,在requset.data中都有post的数据 -频率限制(限制某个ip地址,一分钟只能访问5次) -登录认证(只要没登录,重定向到login路径)、 -记录用户访问日志(ip,时间,访问路径) 5 process_response可以干什么?内部有response对象 -统一给所有(某几个路径)加cookie -统一给所有(某几个路径)加响应头 6 process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数) def process_view(self, request, callback, callback_args, callback_kwargs): # print(callback) # print(callback_args) # print(callback_kwargs) # res=callback(request) # print("中间件1的process_view") return res 7 process_exception 视图函数出错,会执行它(全局异常捕获)(可以记录日志,哪个ip地址,访问哪个路径出的错,利用request对象) # 全局异常捕获,返回4开头的 def process_exception(self, request, exception): print(exception) return render(request,\'error.html\') 8 process_template_response(self,request,response) 该方法对视图函数的返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
5.用法中3的代码
#urls.py urlpatterns = [ path(\'\', views.index), ] #index.html 创建一个index.html就行 #settings.py MIDDLEWARE = [ ... \'app01.mymiddle.MyMiddleware1\', \'app01.mymiddle.MyMiddleware2\', ... ] #mymiddle.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了1\') # print(request.session) # 可不可以返回?必须返回HttpResponse的对象 # return HttpResponse(\'我不让你访问\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了1\') return response #必须返回 class MyMiddleware2(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了2\') # print(request.session) # 可不可以返回?可以返回,但是视图函数就不走了 # return HttpResponse(\'dsb\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了2\') return response #views.py from django.shortcuts import HttpResponse def index(request): print(\'我是视图函数\') return HttpResponse(\'ok\')
6.用法中6的代码
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了1\') # print(request.session) # 可不可以返回?必须返回HttpResponse的对象 # return HttpResponse(\'我不让你访问\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了1\') return response # 路由匹配成功,视图函数执行之前执行 def process_view(self, request, callback, callback_args, callback_kwargs): # print(callback) #指的就是视图函数 # print(callback_args) #() # print(callback_kwargs)#{} #相当于视图函数装饰器 res=callback(request) return res ,写上它,执行顺序会变,会先执行视图函数,再执行。不加它先执行这里再 执行 视图函数 # res=callback(request) # print("中间件1的process_view") # return res class MyMiddleware2(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了2\') # print(request.session) # 可不可以返回? # return HttpResponse(\'dsb\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了2\') return response \'\'\' 执行顺序: 请求来了1 请求来了2 中间件1的process_view 我是视图函数 请求走了2 请求走了1 加上call_back 执行顺序: 请求来了1 请求来了2 我是视图函数 中间件1的process_view 请求走了2 请求走了1 \'\'\'
7.用法中7的代码
#views.py from django.shortcuts import render, HttpResponse, redirect def index(request): print(\'我是视图函数\') a return HttpResponse(\'ok\') #error.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 404 </body> </html> #mymiddle.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了1\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了1\') return response # 路由匹配成功,视图函数执行之前执行 def process_view(self, request, callback, callback_args, callback_kwargs): print("中间件1的process_view") class MyMiddleware2(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象 print(\'请求来了2\') # 所有的请求走了,都会执行它 def process_response(self, request, response): print(\'请求走了2\') return response # 全局异常捕获,返回4开头的报错信息(可以让用户觉得自己错误,而不是服务器内部错误) def process_exception(self, request, exception): print(exception) # name \'a\' is not defined print(\'exception\') #exception return render(request,\'error.html\') \'\'\' 执行顺序: 请求来了1 请求来了2 中间件1的process_view 我是视图函数 name \'a\' is not defined exception 请求走了2 请求走了1 \'\'\'
版权声明:本文为guojieying原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。