1、中间件流程
当启动django程序并发送一个请求后,首先通过WSGI,然后走一遍settings.py中设置的MIDDLEWARE,即中间件:
2、中间件的五个方法:
1) process_request(request):
- request是一个HttpRequest对象
- 在Django决定执行哪个视图之前,process_request()会在每个请求上调用。
2)process_view(request, view_func, view_args, view_kwargs):
- request:一个HttpRequest对象
- view_func :Django会调用的一个Python函数
- view_args:会被传递到视图的位置参数列表
- view_kwargs:会被传递到视图的关键字参数字典
- process_view()会在Django 调用视图之前被调用。它将返回None 或一个Httpresponse对象。如果返回None,Django 将会继续处理这个请求,执行其它的process_view() 中间件,然后调用对应的视图。如果返回一个Httpresponse对象,Django 就不用再去调用其它的view 或exception 中间件,或对应的视图.
3)process_exception(request, exception):
- request:一个HttpRequest对象
- exception:一个被视图中的方法抛出来的 Exception对象
- 如果当一个视图抛出异常时,Django会调用process_exception()来处理,而不会执行process_response。process_exception()应该返回一个None 或者一个Httpresponse对象。如果它返回一个Httpresponse对象,模型响应和响应中间件会被应用,响应结果会返回给浏览器。否则, 默认的异常处理机制将会被触发。
4)process_template_response(request, response):
- request:一个HttpRequest对象
- response:一个TemplateResponse对象(或等价的对象),由Django视图或者中间件返回。
- 如果响应的实例有render()方法,这时候process_template_response()在视图刚好执行完毕之后会被调用。
5)process_response(request, response):
- request:一个HttpRequest对象
- response:Django视图或者中间件返回的HttpResponse或者StreamingHttpResponse对象。
- 该方法会在所有响应返回浏览器之前被调用,这个方法必须返回Httpresponse或者StreamingHttpResponse对象。它可以改变已有的response,或者创建并返回新的HttpResponse或StreamingHttpResponse对象。
注意:最后在响应阶段中,中间件以相反的顺序被应用,即在MIDDLEWARE中,最底下的类会最先被运行。
3、自定义中间件
1)在项目下新建一个文件夹:Middle,在里面建立一个MyMiddle.py文件,写下:
# django1.10 以后的版本需要导入并继承该模块 from django.utils.deprecation import MiddlewareMixin # 创建一个类,并定义process_request和process_response两个方法 # 其它三个方法可以看情况自行定义 class Row(MiddlewareMixin): def process_request(self, request): print('处理请求') def process_response(self, request, response): print('处理响应') return response
2)在settings.py中的MIDDLEWARE里加上自己写的类的路径: