django进阶之中间件

中间件

执行顺序

下面是一个用户请求的执行顺序

1
2
用户请求 --> 接受请求的中间件(process_request) --> url --> view --> 
orm --> templates --> 返回请求的中间件(process_response)

用户请求首先通过中间件,按照 settings.py 中 列表 MIDDLEWARE 顺序执行,执行完成后才继续后面的内容

应用场景

  • 用户登录验证,设置白名单,不需要登录验证
  • 日志记录
  • 对请求的 header 的处理,例如:非法IP地址

自定义中间件

  1. 需要在 settings.py 中的 MIDDLEWARE 中注册
    md.middleware.MiddlewareDemo1
    其中 md.middleware 为路径, MiddlewareDemo1 为对应的类

  2. 定义的类实现两个方法
    def process_request(self, request)
    当该方法遇到 return 时,将不会执行下面的内容,直接被截断
    def process_response(self, request, response)
    该方法必须返回 response

    实例

    md/middleware.py 自定义中间件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import render, redirect, HttpResponse


    white_li = ['/login']


    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 MiddlewareDemo1(MiddlewareMixin):
    def process_request(self, request):
    print('demo1_middleware_process_request')
    if not request.META.get('PATH_INFO') in white_li:
    if not request.session.get('login'):
    return redirect('/login')

    def process_response(self, request, response):
    print('demo1_middleware_process_response')
    return response
  • 在新版本的 django 中MiddlewareMixin不存在,所以此处建议重写该类,避免兼容性问题
  • white_li 为定义的白名单列表,可将不需要验证 session 的页面写入,例如登录页面就不需要验证

settings.py 注册自定义中间件的类

1
2
3
4
5
6
7
8
9
10
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.MiddlewareDemo1',
]

Recommended Posts