一 .中间件简介
中间件是Django请求/响应处理的钩子函数。它是一个轻量级的、低级的"插件系统",用于全局改变Django的输入和输出。中间件是帮助我们在视图函数执行之前都可以做一些额外的操作,它本质就是一个自定义类,类中定义几个方法,Djago框架会在特定的时候自动触发。
每个中间件负责做一些特定的功能。例如,‘django.contrib.auth.middleware.AuthenticationMiddleware’,它是用来将用户与请求关联起来。
二 .编写自己的中间件
中间件工厂是一个可调用的程序,它接受请求并返回响应。
中间件可以定义五个方法,分别是:
- process_request(self, request)
- process_response(self, request, response)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('来自M1 process_request')
class M2(MiddlewareMixin):
def process_request(self, request):
print('来自M2 process_request')
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('来自M1 process_request')
def process_response(self, request, response):
print('来自M1 process_response')
return response
class M2(MiddlewareMixin):
def process_request(self, request):
print('来自M2 process_request')
def process_response(self, request, response):
print('来自M2 process_response')
return response
- process_resquest
需要一个参数request,它的返回值可以是None,也可以是HttpResponse对象,如果返回None,就继续向下走,返回HttpResponse对象就不执行视图函数直接将对象返回给浏览器。
在process_request方法中,视图函数是最后执行的,靠前的先执行。
总结:
- 中间件的process_request方法是在执行视图函数之前执行的。
- 当配置多个中间件时,会按照列表的索引值,从上到下依次执行。
- 不同的中间件之间传递的request是同一个对象。
- process_response
在执行完视图函数之后才执行,执行顺序和process_request方法相反,从下往上依次执行。
定义process_response方法时,需要传参request和response,response是视图函数返回的HttpResponse对象,如果返回一个自己定义的HttpResponse对象,浏览器接收到的也是自定义的而不是后端处理的。
- process_view
process_view(self, request, view_func, view_args, view_kwargs)
该方法有四个参数
request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。
Django会在调用视图函数之前调用此方法,返回None或者HttpResponse对象,如果返回None,Django将继续处理这个请求,执行其他中间件的process_view方法,然后执行视图函数。如果返回HttpResponse对象,那么就不执行视图函数,而是直接掉头,执行process_response方法返回给浏览器。
process_view方法是在Django路由系统之后,视图系统之前执行的,执行顺序按照MIDDLEWARE中的注册顺序从前到后顺序执行的。
- process_exception
process_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
- process_template_response
process_template_response(self, request, response)
它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。
process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。
三 .中间件执行流程
当有请求来时,先按照前后顺序依次执行process_request()方法,process_request如果返回None,就往下执行,如果返回一个HttpResponse对象就不执行process_request,而是执行当前层级的process_response方法,依次向上执行,返回给浏览器。例如下图中在中间件3返回了HttpResponse对象,就执行中间件3的process_response,依次往上返回给浏览器。下面的process_request,process_response都不会执行。
process_request方法都执行完,找到对应的视图函数,先不执行视图函数,而是执行中间件中的process_view方法,process_view返回None就继续依次执行,所有的process_view执行完才执行视图函数。下图中的中间件3返回了HttpResponse对象,下面的process_view方法就不执行了,直接执行最下边的process_response方法,依次向上返回给浏览器。
process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。
到此这篇关于Python Django中间件详细介绍的文章就介绍到这了,更多相关Python Django 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!