一、middleware(中间件)
1、什么是中间件
-
问题:如何过滤掉没有登陆就访问其他页面?
解决方法- 使用装饰器(但是我们要过滤的页面很多,这个方法就很不方便了)
- 使用中间件(使用此方法要注意,中间件是全局操作,所以要慎用)
-
概念:
中间件是一个用来处理Django的请求和响应的一个类,可以改变全局范围内Django的输入和输出。简单理解就是中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作。
-
举个例子:
中间件就好比火车站的每一层安检,首先检查车票,然后再检查是否携带危险物品,如果车票或者行李不符合要求,就不能坐上火车(目标)。
由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
(简单理解就是只要设置了中间件,任何请求都会经过中间件) -
每个中间件都负责做一些特定的功能。

-
我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:

(二)自定义中间件
- 中间件五个方法
中间件可以定义五个方法,分别是:
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)(不用,自己查阅)
process_exception(self, request, exception)
process_response(self, request, response)
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
(主要的是process_request和process_response) - 定义中间件步骤
-
创建一个类继承MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin #中间件MD1 class MD1(MiddlewareMixin): # 覆写方法 def process_request(self, request): print('MD1...request...') #中间件MD2 class MD2(MiddlewareMixin): def process_request(self, request):print('MD2...request...') -
覆写想使用的方法
-
在setting.py中进行注册

-
- 方法讲解
-
process_request(self,request)方法
此方法有一个参数,就是request,这个request和视图函数中的request是同一个。
此方法的返回值可以是None也可以是HttpResponse对象。
返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。
(提示:rander() 函数返回的是HttpResponse对象)- 总结:
(1)中间件的process_request方法是在执行视图函数之前执行的。
(2)当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的 索引值,从前到后依次执行的。
(3)不同中间件之间传递的request都是同一个对象 。
- 总结:
-
process_response(request,response)方法
它有两个参数,一个是request,一个是response,request就是上述例子中一样的对象,response是视图函数返回的对象。该方法必须返回一个响应对象。- 响应流程:

- 响应流程:
-
process_view()方法
process_view(self, request, view_func, view_args, view_kwargs)
该方法有四个参数
(1)request是HttpRequest对象。
(2)view_func是Django即将使用的视图函数。
(3)view_args是将传递给视图的位置参数的列表.
(4)view_kwargs是将传递给视图的关键字参数的字典。- Django会在调用视图函数之前调用process_view方法。
它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。 - 响应流程

- Django会在调用视图函数之前调用process_view方法。
-
process_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
-
本文深入探讨Django中间件的概念,解释如何通过中间件在视图函数前后执行额外操作,实现请求过滤等功能。涵盖中间件的自定义方法,如process_request和process_response,及其在全局请求处理中的作用。
222

被折叠的 条评论
为什么被折叠?



