Django框架之中间件MiddleWare的实现

 更新时间:2024年10月08日 09:19:59   作者:亦非我所愿丶  
这篇文章主要介绍了Django框架之中间件MiddleWare的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、中间件

Middleware是Django请求/响应处理的插件框架。它是一个轻巧的低级"插件"系统,用于全局改变Django的输入或输出。

每个中间件组件负责执行某些特定功能。例如,Django包含一个中间件组件 AuthenticationMiddleware,它将用户与使用会话的请求相关联。

该文档介绍了中间件的工作原理,如何激活中间件以及如何编写自己的中间件。Django附带了一些你可以直接使用的内置中间件。它们记录在内置中间件参考中

二、激活中间件

要激活中间件,请将其添加到MIDDLEWARE Django设置中的列表中
如下,我激活了三个中间件 Middleware.test.m1,Middleware.test.m2,Middleware.test.m3

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.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

三、中间件请求和响应

在请求阶段,调用views之前,django按照MIDDLEWARE_CLASSES中定义的顺序从上到下调用中间件。

在Django中间件中,总共有分为从上到下hooks和从下到上hooks

从上到下hooks:

  • process_request()
  • process_view()

从下到上hooks:

  • process_exception()
  • process_template_response()
  • process_response()

四、中间件处理流程说明(如下述的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.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

一个中间件最少有一个process_request hooks和一个process_response hooks,前者是用来处理请求的,后者是用来处理响应的

那除了必须的两个hooks以外,还有其他三个hooks,分别是 process_view, process_exception, process_template_response

process_view 主要是用来执行middleware中具体的处理函数,如中间件请求中所说,是从上到下的hooks,表示process_view在views视图函数之前执行

process_exception 一般情况下不会执行,只有在views视图函数中出现exception异常时,才会执行;如中间件请求中所说,是从下到上的hooks,表示processs_exception在views视图函数之后执行,也就是views视图函数出错之后,才会执行

processs_template_response 一般情况下也不会执行,也就是说,只有views中的函数返回对象中具有render方法,它才会执行

五、中间件处理顺序(如下述的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.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

1、process_request 阶段
当一个用户发起请求后,该请求会经过上述的所有中间件,并且自上而下执行;先执行所有中间件的 process_request方法,该方法如果返回HttpResponse,则执行从当前的中间件向上执行 process_responsse,如果返回None,则接着向下执行 process_request

2、process_view 阶段
当该用户的请求执行完所有中间件 process_request 方法后,如果返回都为None,那么接下来会执行所有中间件的 process_view 方法,如果其中一个 process_view 返回HttpResponse,则会跳过接下来所有中间件的 process_view,直接会从最下面的process_response自下而上执行,如果process_view返回None,则会继续向下执行

3、views 阶段
当该用户的请求执行完所有的process_request和process_view阶段,并且没有返回HttpResponse;换句话说,返回的都是None,那么这个时候就会到达views视图函数

在这里,可能会有三种可能性
(1) views中的函数返回对象中具有render方法
(2) views中的函数产生异常
(3) views中的函数返回对象中具有render方法,并且views中的函数产生异常

当出现第一种情况的时候,函数就会开始执行所有中间件的 process_template_response 方法,并且自下而上在每个中间件中挨个执行(当有定义 process_template_response 方法的时候)
当出现第二种情况的时候,函数就会开始执行所有中间件的 process_exception 方法,并且自下而上在每个中间件中挨个执行(当有定义 process_exception 方法的时候)
当出现第三种情况的时候,函数就会自下而上同时执行所有中间件中定义的 process_exception 和 process_template_response 方法(在这个时候会优先执行所有中间件中的process_template_response 方法,再执行所有中间件中的process_exception方法)

4、process_response 阶段
当 process_request, process_view,views,process_template_response,process_exception 方法都执行完成后,开始自下而上从中间件中执行 process_response 方法,直到最上层中间件的 process_response 方法执行完毕,接着返回给用户

六、Django 自定义中间件

1、在settings中定义三个中间件

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.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

2、创建中间件路径

在项目跟路径下面创建中间件路径
./Middleware/test.py

3、定义中间件

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse

class m1(MiddlewareMixin):
    def process_request(self, request):
        print('m1 request')

    def process_view(self, request, func_view, func_args, func_kwargs):
        print('m1 view')

    def process_response(self, request, response):
        print('m1 response')
        return response

    def process_exception(self, request, exception):
        print('m1 exception')

    def process_template_response(self, request, response):
        print('m1 template response')
        return response


class m2(MiddlewareMixin):
    def process_request(self, request):
        print('m2 request')

    def process_view(self, request, func_view, func_args, func_kwargs):
        print('m2 view')

    def process_response(self, request, response):
        print('m2 response')
        return response

    def process_exception(self, request, exception):
        print('m2 exception')

    def process_template_response(self, request, response):
        print('m2 template response')
        return response


class m3(MiddlewareMixin):
    def process_request(self, request):
        print('m3 request')

    def process_view(self, request, func_view, func_args, func_kwargs):
        print('m3 view')

    def process_response(self, request, response):
        print('m3 response')
        return response

    def process_exception(self, request, exception):
        print('m3 exception')

    def process_template_response(self, request, response):
        print('m3 template response')
        return response

4、定义视图函数

class Foo:
    def render(self):
        int('v')
        return HttpResponse('OK')

def middleware(request):
    #return render(request, 'login.html')
    #return HttpResponse('middleware')
    return Foo()

七、一个请求经过中间件的请求周期

由于views视图函数中有个报错需要触发中间件中定义的 process_exception 方法,所以便于展示执行顺序,我去除了具体的报错内容

m1 request
m2 request
m3 request
m1 view
m2 view
m3 view
m3 template response
m2 template response
m1 template response
m3 exception
m2 exception
m1 exception
m3 response
m2 response
m1 response

八、结论

大家可根据自己需求自行编写中间件,并且测试中间件中每个方法的执行顺序,总共有5个方法,分别为
process_request
process_view
process_template_response
process_exception
process_response

另外:
Django 官方不建议在中间件层处理 request.POST 数据,csrf中间件是个例外,因为要全局安全处理用户token

到此这篇关于Django框架之中间件MiddleWare的实现的文章就介绍到这了,更多相关Django 中间件MiddleWare内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python装饰器用法实例分析

    Python装饰器用法实例分析

    这篇文章主要介绍了Python装饰器用法,结合实例形式分析了带参数装饰器、无参数装饰器等相关实现与使用技巧,需要的朋友可以参考下
    2019-01-01
  • Python中让MySQL查询结果返回字典类型的方法

    Python中让MySQL查询结果返回字典类型的方法

    这篇文章主要介绍了Python中让MySQL查询结果返回字典类型的方法,默认情况下Mysql返回的是元组类型,本文实现了返回字典类型,需要的朋友可以参考下
    2014-08-08
  • Python 相对路径和绝对路径及写法演示

    Python 相对路径和绝对路径及写法演示

    这篇文章主要介绍了Python 相对路径绝对路径的相关知识,结合实例代码介绍了Python 相对路径、绝对路径的写法实例演示,需要的朋友可以参考下
    2023-02-02
  • Python对Excel按列值筛选并拆分表格到多个文件的代码

    Python对Excel按列值筛选并拆分表格到多个文件的代码

    这篇文章主要介绍了Python对Excel按列值筛选并拆分表格到多个文件,本文通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2019-11-11
  • Python数据类型详解(三)元祖:tuple

    Python数据类型详解(三)元祖:tuple

    本文给大家介绍的是Python数据类型中的元祖(tuple),简单的说Tuple,与列表一样,元素也是不可变的,但与列表不同,在一个元祖可以包含不同类型的元素
    2016-05-05
  • Gradio机器学习模型快速部署工具接口状态

    Gradio机器学习模型快速部署工具接口状态

    这篇文章主要为大家介绍了Gradio机器学习模型快速部署工具接口状态的原文翻译,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 分享8 个常用pandas的 index设置

    分享8 个常用pandas的 index设置

    这篇文章主要介绍了分享8 个常用pandas的 index设置,pandas 中的 index 是行索引或行标签。行标签可以说是 pandas 的灵魂一签,支撑了 pandas 很多强大的业务功能,比如多个数据框的 join, merge 操作,自动对齐等,下面来看看文章得具体介绍吧
    2021-12-12
  • Python numpy多维数组实现原理详解

    Python numpy多维数组实现原理详解

    这篇文章主要介绍了python numpy多维数组实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python 3.8 新功能来一波(大部分人都不知道)

    Python 3.8 新功能来一波(大部分人都不知道)

    Python 3.8 是Python语言的最新版本,它适合用于编写脚本、自动化以及机器学习和Web开发等各种任务。这篇文章主要介绍了Python 3.8 新功能(大部分人都不知道),需要的朋友可以参考下
    2020-03-03
  • Python 6种基本变量操作技巧总结

    Python 6种基本变量操作技巧总结

    这篇文章主要为大家总结了Python必备的6种基本变量操作技巧,文中通过图片合示例详细为大家进行了介绍,感兴趣的小伙伴可以了解一下
    2022-03-03

最新评论