Django之中间件浅析

Posted CppTeam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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_argsview_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


我知道你  在看  哦!





以上是关于Django之中间件浅析的主要内容,如果未能解决你的问题,请参考以下文章

虚拟化技术浅析第二弹之初识Kubernetes

浅析消息队列之rabbitMQ

django之设置中间件模板

Django之路

高并发之——不得不说的线程池与ThreadPoolExecutor类浅析

Django之中间件