中间件
- 什么是中间件
django 中间件是一个轻量级的“插件”系统,通过中间件可以在用户请求与服务器响应的过程之间插入自己定制的处理代码,当django接收到一个请求时,优先由中间件进行处理,在完成处理时可以直接由中间件返回 response。
- 中间件的执行顺序
在 settings.py 文件中名为 MIDDLEWARE 的列表中注册中间件。按最优先从上至下顺序排列如下:- 优先处理所有中间件的 request
- 优先处理 MIDDLEWARE 列表中索引值靠前的 request
- 优先处理 MIDDLEWARE 列表中索引值靠后的 response
五大中间件方法
中间件可以定义五个方法:
-
Request 预处理函数: process_request(self, request)
在 django 接收到 request 请求后未解析 url 时调用,是中间件中最优先调用的方法。可以返回None、HttpResponse 对象或不返回任何东西。当返回None或不返回时,请求将由后续的中间件方法继续处理;当返回 HttpResponse 对象时,除 process_response 后处理函数外的所有中间件将被跳过,直接返回该 HttpResponse 对象。 -
View 预处理函数:process_view(self, request,view_func,view_args,view_kwargs)
在 request 预处理函数执行完毕,确定了即将调用的处理函数 view_func 后且并未执行时调用。定义了View预处理函数之后,可以不使用但必须接收除self外的4个参数,这4个参数的参数名并无硬性要求是某几个,通常使用下面几个参数名来依次接收。可以返回None,HttpResponse对象、或不返回,效果与 process_request 一致
request: HttpRequest 对象
view_func: 即将调用的 view 视图函数对象本身
view_args:即将传入 view_func 的位置参数列表
view_kwargs:即将传入 view_func 的关键字参数字典 -
Template 模板渲染函数:process_template_response(self, request, response)
只有在视图函数返回的对象中有 render() 方法时才会被调用,该方法直接返回 render 方法的返回值,需要注意的是执行完template方法后才会继续调用视图函数。
process_template_respons 必须返回一个 response 对象。 -
Exception 后处理函数:process_exception(self, request, exception)
在视图函数出现错误且未被捕获时马上被调用。hook 住错误信息 exception 后进行定制的操作。process_exception需返回None 或者 HttpResponse 对象,当返回None时,使用django默认的错误处理机制(默认错误页),当返回 HttpResponse 对象时,直接使用该对象作为内置异常处理机制的替代。
exception:视图函数抛出的异常对象。 -
Response 后处理函数:process_response(self, request, response)
所有的中间件函数、view视图函数执行完毕并生成 response 之后调用。process_response 必须返回 HttpResponse 对象,可以直接返回接收到的 response, 也可以生成一个新的 HttpResponse 对象。作为最后处理的函数,不会受到前面所有中间件的干扰。
自定义中间件
自定义中间件的步骤:
- 导入
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
- 编写中间件类
- 视图函数编写与url设置
- settings 注册
MIDDLEWARE = [
'mydjango.middleware1.TestMiddleware'
]
中间件示例
示例一:
- 使用一个简单的页面,仅用于 render 一个页面,作为视图函数
class Login1(View):
def get(self, request):
print('视图函数开始执行')
return render(request, 'session/login.html')
- 编写中间件类,让所有中间件被调用时打印出一句话
class TestMiddleware(MiddlewareMixin):
def process_request(self, request):
print('这里是request预处理函数')
def process_view(self, request, view_func, view_args, view_kwargs):
print('这是 view 预处理函数')
def process_exception(self, request, exception):
print('调用了exception函数')
return HttpResponse(exception)
def process_response(self, request, response):
print('response 后处理函数')
return response
- 在视图函数中故意造成错误,可以看到所有的中间件所有中间件的运行顺序
示例二 process_template_response() 的使用:
- 修改示例一的视图函数,增加了 render 方法。
class Login1(View):
def get(self, request):
print('视图函数开始执行')
return render(request, 'session/login.html')
def render(self):
print('视图函数开始执行 render版本')
return render(self.request, 'session/login.html')
- 使用一个新的函数作为视图函数,并将 Login1 对象返回。
def index_test(request):
obj = Login1(request)
return obj
- 在示例一的中间件类中增加 process_template 中间件方法。
def process_template_response(self, request, response):
print('调用了template')
return response
- 访问 index_test 视图函数后,查看结果。
参考文献
原文标题 | 作者 |
---|---|
django中间件 | 迎风而来 |
Django框架之中间件(MiddleWare)解析 | 新钛云服 |