Django之中间件浅析
“ 作者之前学习过用Django技术实现了一个博客制作,运用到了Django框架里的中间件。本文将粗略地介绍Django应用开发中的中间件基础知识。欢迎读者朋友们阅读。”
01
前言介绍
中间件函数是Django框架给我们预留的函数接口,是一个轻量级、底层的插件系统。让我们可以干预请求和应答的过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IOC。
其实在Django开发中,我们一直都在使用中间件。打开Django项目的Settings.py文件,就看到下面的MIDDLEWARE配置项。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
MIDDLEWARE配置项里这些字符串,就是一个个中间件。MIDDLEWARE 的顺序很重要,具有先后关系,因为有些中间件会依赖其他中间件。例如:AuthenticationMiddleware 需要在会话中间件中存储的经过身份验证的用户信息,因此它必须在 SessionMiddleware 后面运行 。
在请求阶段,调用视图之前,Django 按照定义的顺序执行中间件 MIDDLEWARE,自顶向下。
02
中间类自定义方法
有时候,为了实现一些特定的需求,我们可能需要编写自己的中间件。每个中间件组件都是一个Python类。
(1)Django框架提供了五个中间件自定义方法,如下表所示:
钩子函数 | 执行时机 | 返回值 |
process_request | 接受request之后,确定所执行的view之前 | None或者HttpResponse对象 |
process_view | 确定了所要执行的view之后,view真正执行之前 | None或者HttpResponse对象 |
process_exception | view执行抛出异常 | None或者HttpResponse对象 |
process_template_response | view刚执行完毕,process_response之前 | 实现了render方法的响应对象 |
process_response | view执行完毕之后,返回响应时 | HttpResponse对象 |
(2)自定义方法详细解释
①process_request(self,request)
只有一个参数,也就是request请求内容,和视图函数中的request是一样的。所有的中间件都是同样的request,不会发生变化。它的返回值可以是None也可以是HttpResponse对象。返回None的话,表示一切正常,继续走流程,交给下一个中间件处理。返回HttpResponse对象,则发生短路,不继续执行后面的中间件,也不执行视图函数,而将响应内容返回给浏览器。
②process_view(self, request, view_func, view_args, view_kwargs)
该方法有四个参数。request是HttpRequest对象。view_func是Django即将使用的视图函数。(它是实际的函数对象,而不是函数的名称作为字符串。)view_args是将传递给视图的位置参数的列表。view_kwargs是将传递给视图的关键字参数的字典。view_args和view_kwargs都不包含第一个视图参数(request)。
它应该返回None或一个HttpResponse对象。如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。
③process_exception(self, request, exception)
该方法两个参数:一个HttpRequest对象,另一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。
④process_template_response(self,request,response)
这个方法比较少用。它的参数一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法。
⑤process_response(self, request, response)
它有两个参数,一个是request,一个是response,response是视图函数返回的HttpResponse对象。
03
中间件的简单配置
1.在主项目目录下新建放中间件的文件夹middleware,在该文件夹下创建__init__.py文件和mymiddleware.py文件:
2.编写中间件文件,例如下面的mymiddleware.py文件中:
from django.utils.deprecation import MiddlewareMixin
class MiddleWare1(MiddlewareMixin):
def process_request(self, request):
print("process_request......")
def process_view(self, request, view_func, view_args, view_kwargs):
print("process_view......")
def process_response(self, request, response):
print("process_response......")
return response
3.settings.py中添加中间件:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'middleware.mymiddleware.MiddleWare1'#激活自定义的中间件
)
04
补充
参考文献:
Django官方文档 https://docs.djangoproject.com/en/2.1/topics/http/middleware/
CPP
TEAM
以上便是此次推文全部内容,谢谢各位
2020.06.07
我知道你 在看 哦!