2020-10-24

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.pyfrom django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import render,HttpResponseclass MyMiddleware1(MiddlewareMixin): # 所有的请求来了,都会走到它 def process_request(self,request): # request就是当请求的request对象  print('请求来了') # 所有的请求走了,都会执行它 def process_response(self, request, response):  print('请求走了')  return response#views.pyfrom 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 res7 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.pyurlpatterns = [ path('', views.index),]#index.html创建一个index.html就行#settings.pyMIDDLEWARE = [ ...  'app01.mymiddle.MyMiddleware1',  'app01.mymiddle.MyMiddleware2', ...]#mymiddle.pyfrom django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import render,HttpResponseclass 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.pyfrom django.shortcuts import HttpResponsedef index(request): print('我是视图函数') return HttpResponse('ok')

6.用法中6的代码

from django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import render,HttpResponseclass 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 resclass 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.pyfrom django.shortcuts import render, HttpResponse, redirectdef 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.pyfrom django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import render,HttpResponseclass 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 definedexception请求走了2请求走了1'''

 

原文转载:http://www.shaoqun.com/a/482224.html

houzz:https://www.ikjzd.com/w/236

美菜网:https://www.ikjzd.com/w/1874

kkr:https://www.ikjzd.com/w/1340


1.django内置中间件#中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能#django内置中间件'django.middleware.security.SecurityMiddleware','django.contrib.ses
启明星软件:https://www.ikjzd.com/w/1436
粉丝通:https://www.ikjzd.com/w/743
深圳美术馆好玩吗?:http://tour.shaoqun.com/a/39028.html
六一重温《爸爸去哪儿》 长隆野生动物园园区特色:http://tour.shaoqun.com/a/57230.html
中山哪些有泡温泉的地方?:http://tour.shaoqun.com/a/1957.html

No comments:

Post a Comment