Django中间件执行顺序

中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

1 中间件的定义方法

定义一个中间件工厂函数,然后返回一个可以别调用的中间件。

中间件工厂函数需要接收一个可以调用的get_response对象。

返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

python;gutter:true; def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。</p> <pre><code>def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware </code></pre> <pre><code> 例如,在users应用中新建一个middleware.py文件, ;gutter:true;
def my_middleware(get_response):
print(‘init 被调用’)
def middleware(request):
print(‘before request 被调用’)
response = get_response(request)
print(‘after response 被调用’)
return response
return middleware

定义好中间件后,需要在settings.py 文件中添加注册中间件

python;gutter:true; 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', 'users.middleware.my_middleware', # 添加中间件 ]</p> <pre><code> 定义一个视图进行测试 ;gutter:true;
def demo_view(request):
print(‘view 视图被调用’)
return HttpResponse(‘OK’)

执行结果

Django中间件执行顺序

注意:Django运行在调试模式下,中间件init部分有可能被调用两次。

2 执行流程

Django中间件执行顺序

3 多个中间件的执行顺序

  • 在请求视图被处理前,中间件由上至下依次执行
  • 在请求视图被处理后,中间件由下至上依次执行

Django中间件执行顺序

示例:

定义两个中间件

python;gutter:true; def my_middleware(get_response): print('init 被调用') def middleware(request): print('before request 被调用') response = get_response(request) print('after response 被调用') return response return middleware</p> <p>def my_middleware2(get_response): print('init2 被调用') def middleware(request): print('before request 2 被调用') response = get_response(request) print('after response 2 被调用') return response return middleware</p> <pre><code> 注册添加两个中间件 ;gutter:true;
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’,
‘users.middleware.my_middleware’, # 添加
‘users.middleware.my_middleware2’, # 添加
]

执行结果

python;gutter:true;
init2 被调用
init 被调用
before request 被调用
before request 2 被调用
view 视图被调用
after response 2 被调用
after response 被调用

总结:中间件的本质其实就是个装饰器,对于装饰器我之前的随笔里也详细说过,装饰器的本质其实就是个闭包

Django中间件执行顺序

对于装饰器来说,在这里程序从上到下执行,开始记录装饰器1-3,然后读到了函数的时候,装饰器开始装饰,把函数的引用传入装饰器中,从装饰器3开始往上装饰,所以这时候开始执行装饰器3的初始化,并把装饰完的函数当做一个新的函数,再次把新的引用传入到装饰器2,接着装饰器2进行初始化,再次把新的函数的引用传入到装饰器1进行装饰,这时候装饰器1的初始化开始,并开始执行,从而接下来的执行顺序为1-3执行装饰的内容,最后再执行本来的函数,达到一个对原有函数增加功能和特性的要求。

装饰器:从程序开始的顺序,从上到下读取—-》从下到上装饰—-》从上到下执行

在中间件中,执行顺序等同,只不过中间件装饰的是视图函数或者是试图类,会有一个init()初始化,为了便于理解我在说明装饰器顺序的时候,那里说的初始化就是现在的init(),也就是中间件在执行上也是从最接近函数或者类的中间件开始初始化,在中间件注册时,如果有多个中间件,程序按照从上到下的顺序来确认中间件,接着执行视图函数的时候,开始从下到上的进行init(),这里的初始化init()类似于Flask框架里四种请求勾子中的请求开始前执行一次的意思,从下到上执行完init后,再从上到下执行请求前所要执行的代码(见上文),请求完成后再从下往上执行请求后的代码(见上文)。

中间件:从程序开始的顺序,从上到下读取—-》从下到上初始化init()—-》从上到下执行请求前—-》视图的请求—-》从下到上执行请求后

Original: https://www.cnblogs.com/wf-skylark/p/9310448.html
Author: 汪凡
Title: Django中间件执行顺序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584403/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在Win11的WSL中体验IDEA等GUI程序

    原本已经 放弃WSL很久了,这两天把Win10更新到Win11,看到WSL2已经发布,而且貌似还有很大升级还可以在 WSL中跑Linux GUI应用。在加上Win11的支持简直可以…

    数据结构和算法 2023年6月7日
    074
  • 打牌 1

    重新学了一遍记忆化搜索实现的数位 dp,谈一下理解,毕竟我是普及组小朋友。 这个东西的实际意义大概就是通过将「有上界限制的分支使用搜索实现,一般的分支使用 dp 转移」的手法,将带…

    数据结构和算法 2023年6月12日
    089
  • hdu 6287 口算训练

    题意: 小Q非常喜欢数学,但是他的口算能力非常弱。因此他找到了小T,给了小T一个长度为n n的正整数序列a 1 ,a 2 ,…,a n a1,a2,…,an…

    数据结构和算法 2023年6月12日
    078
  • 学习札礼——数据结构

    哈希表 出了不能求循环节在都比KMP强 把-10e9~10e9的数映射为0~10e5,xmodN(要把N设置为第一个大于的质数,减少冲突) 开放寻址法核心就是先找个一个位置,如果这…

    数据结构和算法 2023年6月7日
    084
  • 1005 Spell It Right (20 分)

    1. 题目 Given a non-negative integer N, your task is to compute the sum of all the digits of…

    数据结构和算法 2023年6月7日
    076
  • Python <算法思想集结>之抽丝剥茧聊动态规划

    1. 概述 &#x52A8;&#x6001;&#x89C4;&#x5212;算法应用非常之广泛。 对于算法学习者而言,不跨过 &#x52A8…

    数据结构和算法 2023年6月7日
    081
  • 模板集合

    建议用标题旁边打开的目录,更清晰明了! 太多了,编辑的时候要找好久,数据结构和图论都搬出去了,下面有链接。离数学搬家也不远了。 好了,数学也搬出去了。 头文件 纯粹方便用 #inc…

    数据结构和算法 2023年6月7日
    0102
  • 经典设计原则-SOLID

    SOLID 设计原则包含以下 5 种原则: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open Closed Princi…

    数据结构和算法 2023年6月8日
    095
  • B树详解

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 什么是B树 B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。使用B树这种数据结构…

    数据结构和算法 2023年6月8日
    0105
  • 组合数问题 社论

    组合数问题给 (n,p,k,r),求 [\sum_{i=0}^{\infty}\dbinom{nk}{ik+r} ] 对 (p) 取模的结果 .(1 \leq n \leq 10^…

    数据结构和算法 2023年6月7日
    080
  • Html飞机大战(十): 消灭敌机

    好家伙,本篇是带着遗憾写完的。 很遗憾,我找了很久,找到了bug但并没有成功修复bug 再上一篇中我们看到 子弹射中了敌机,但是敌机并没有消失,所以这篇我们要来完善这个功能 按照惯…

    数据结构和算法 2023年6月12日
    089
  • udp可靠性传输设计之kcp

    udp传输本身是不可靠的,要做到可靠性传输,需要参考tcp的原理在用户层进行修改,所以在可靠性设计之前,需要弄明白tcp传输的一些原理。 tcp传输有一些机制可以保证可靠性传输:1…

    数据结构和算法 2023年6月16日
    0119
  • 力扣2. 两数相加

    2. 两数相加 2. 两数相加难度:中等描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相…

    数据结构和算法 2023年6月16日
    0117
  • 容斥原理

    链接:https://ac.nowcoder.com/acm/contest/548/F来源:牛客网 立华奏是一个天天打比赛的萌新。 省选将至,萌新立华奏深知自己没有希望进入省队,…

    数据结构和算法 2023年6月7日
    080
  • The Shared_ptr Class(memory header)

    1.A default initialized smart pointer holds a null pointer. shared_ptr<vector<string…

    数据结构和算法 2023年6月7日
    086
  • 单调栈/单调队列入门详解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球