中间件
执行顺序
下面是一个用户请求的执行顺序1
2用户请求 --> 接受请求的中间件(process_request) --> url --> view -->
orm --> templates --> 返回请求的中间件(process_response)
用户请求首先通过中间件,按照 settings.py
中 列表 MIDDLEWARE
顺序执行,执行完成后才继续后面的内容
应用场景
- 用户登录验证,设置白名单,不需要登录验证
- 日志记录
- 对请求的 header 的处理,例如:非法IP地址
自定义中间件
需要在 settings.py 中的 MIDDLEWARE 中注册
md.middleware.MiddlewareDemo1
其中 md.middleware 为路径, MiddlewareDemo1 为对应的类定义的类实现两个方法
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
10MIDDLEWARE = [
'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',
]