Django middleware中间件
1.什么是Django中间件
2.Django中间件的执行逻辑
3.实现自定义中间件
1.什么是DJango中间件
Django中间件是一个类;
请求前后在合适的时机执行相应的方法;
可以通过在settings文件中配置MIDDLEWARE_CLASSES属性来设置使用何种中间件。
MIDDLEWARE = [
# 安全中间件,处理请求应答安全的处理
'django.middleware.security.SecurityMiddleware',
# 提供由状态服务Session中间件
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 防止跨站伪造请求的中间件
# 'django.middleware.csrf.CsrfViewMiddleware',
# Django自带的认证体系中间件
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 消息中间件
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Gzip压缩中间件,处理网页请求/应答中文件压缩:GzipMiddleware
2.Django中间件执行逻辑
如下图,每个请求都会两次经过配置的中间件,多个中间件之间存在执行顺序。
3.实现自定义中间件settings.py
# 项目启动后自动实例化所有中间件
MIDDLEWARE = [
...
'ops.middlewaredemo.TestMiddleware',
'ops.middlewaredemo.Test2Middleware',
...
]
ops/middlewaredemo.py
class TestMiddleware:
def __init__(self, get_response):
self.get_response = get_response
print('build TestMiddleware')
def __call__(self, request):
print('TestMiddleware before request.')
response = self.get_reponse(request)
print('TestMiddleware after request.')
return response
class Test2Middleware:
def __init__(self, get_response):
self.get_response = get_response
print('build TestMiddleware')
def __call__(self, request):
print('Test2 before request.')
response = self.get_reponse(request)
print('Test2 after request.')
return response
apis/views/test.py
def helloworld(request):
data = dict()
data['query'] = request.GET.get('info')
# http://127.0.0.1:8000/api/v1.0/service/hello?info=beijing
return JsonResponse(data=data, safe=False, status=200) # {"query": "beijing"}
配置路由后,启动项目访问web helloworldconsole:
D:\django_project\backend_ch1_sec1\ops\middlewaredemo.py: __call__: 13 INFO - TestMiddleware before request.
D:\django_project\backend_ch1_sec1\ops\test2middleware.py: __call__: 14 INFO - Test2 before request.
D:\django_project\backend_ch1_sec1\ops\test2middleware.py: __call__: 16 INFO - Test2 after request.
D:\django_project\backend_ch1_sec1\ops\middlewaredemo.py: __call__: 16 INFO - TestMiddlerware after request.
E:\Python\lib\site-packages\django\core\servers\basehttp.py: log_message: 124 INFO - "GET /api/v1.0/service/hello?info=beijing HTTP/1.1" 200 20
从console输出可知,顺序执行,并且两次进过middleware
还没有评论,来说两句吧...