Django---中间件

a. 中间件是一个类
- process_request
- 有,直接执行当前中间件和上方中间件的process_response
- 无
应用: 用户登录授权(排除不需要登录的url)

实例:setting.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'md.middleware.M1',
    'md.middleware.M2',
]

新增midle ware 文件夹

from django.shortcuts import HttpResponse,redirect

class MiddlewareMixin(object):
  def __init__(self, get_response=None):
    self.get_response = get_response
    super(MiddlewareMixin, self).__init__()


  def __call__(self, request):
    response = None
    if hasattr(self, 'process_request'):
      response = self.process_request(request)
    if not response:
      response = self.get_response(request)
    if hasattr(self, 'process_response'):
      response = self.process_response(request, response)
    return response

class M1(MiddlewareMixin):

    def process_request(self,request): #request的时候进去
        print('m1.process_request')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs): #走完所有request再执行该函数
        print('m1.process_view')

    def process_exception(self,request,exception):#有异常走该函数
        print('m1.process_exception')

    def process_response(self,request,response):#返回reponse时执行该函数
        print('m1.process_response')
        return response

    def process_template_response(self,request,response): #用render渲染时执行该函数
        print('m1.process_template_response')
        return response

class M2(MiddlewareMixin):
    def process_request(self, request):
        print('m2.process_request')

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        print('M2.process_view')

    def process_exception(self,request,exception):
        print('m2.process_exception')
        return HttpResponse('开发的程序员已经被打死')
    def process_response(self, request, response):
        print('m2.process_response')
        return response

    def process_template_response(self,request,response):
        print('m2.process_template_response')
        return response

流程:

- process_response
- 必须有返回值

- process_view
- process_exception

- process_tempalte_response
- 必须有返回值
- 必须对象中要有render方法

b. 流程

c. 什么时候用中间件?所有请求统一做处理时使用
- 登录验证

d. 中间件中的方法,可以有任意个

原文地址:https://www.cnblogs.com/mona524/p/7544720.html