Django 中间件_Mr Allen的博客-程序员秘密_django 中间件指定方法不执行

技术标签: python  django  框架  

Django 中间件

Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。

浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示:

img

Django 中间件作用:

  • 修改请求,即传送到 view 中的 HttpRequest 对象。
  • 修改响应,即 view 返回的 HttpResponse 对象。

中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。

配置中的每个字符串选项都是一个类,也就是一个中间件。

Django 默认的中间件配置:

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',
]

自定义中间件

中间件可以定义四个方法,分别是:

process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)

自定义中间的步骤:

在 app 目录下新建一个 py 文件,名字自定义,并在该 py 文件中导入 MiddlewareMixin:

from django.utils.deprecation import MiddlewareMixin

img

自定义的中间件类,要继承父类 MiddlewareMixin:

class MD1(MiddlewareMixin): 
    pass

在 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',
  
  'app01.middlewares.MD1',
]

自定义中间件类的方法

自定义中间件类的方法有:process_request 和 process_response。

img

process_request 方法

process_request 方法有一个参数 request,这个 request 和视图函数中的 request 是一样的。

process_request 方法的返回值可以是 None 也可以是 HttpResponse 对象。

  • 返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。
  • 返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。

process_request 方法是在视图函数之前执行的。

当配置多个中间件时,会按照 MIDDLEWARE中 的注册顺序,也就是列表的索引值,顺序执行。

不同中间件之间传递的 request 参数都是同一个请求对象。

实例

**from** django.utils.deprecation **import** MiddlewareMixin

**from** django.shortcuts **import** render, HttpResponse

**class** MD1(MiddlewareMixin):
  **def** process_request(self, request):
    **print**("md1  process_request 方法。", id(request)) #在视图之前执行

img

process_response

process_response 方法有两个参数,一个是 request,一个是 response,request 是请求对象,response 是视图函数返回的 HttpResponse 对象,该方法必须要有返回值,且必须是response。

process_response 方法是在视图函数之后执行的。

当配置多个中间件时,会按照 MIDDLEWARE 中的注册顺序,也就是列表的索引值,倒序执行。

实例

**class** MD1(MiddlewareMixin):
  **def** process_request(self, request):
    **print**("md1  process_request 方法。", id(request)) #在视图之前执行


  **def** process_response(self,request, response): :#基于请求响应
    **print**("md1  process_response 方法!", id(request)) #在视图之后
    **return** respons

从下图看,正常的情况下按照绿色的路线进行执行,假设中间件1有返回值,则按照红色的路线走,直接执行该类下的 process_response 方法返回,后面的其他中间件就不会执行。

img

process_view

process_view 方法格式如下:

process_view(request, view_func, view_args, view_kwargs)

process_view 方法有四个参数:

  • request 是 HttpRequest 对象。
  • view_func 是 Django 即将使用的视图函数。
  • view_args 是将传递给视图的位置参数的列表。
  • view_kwargs 是将传递给视图的关键字参数的字典。

view_args 和 view_kwargs 都不包含第一个视图参数(request)。

process_view 方法是在视图函数之前,process_request 方法之后执行的。

返回值可以是 None、view_func(request) 或 HttpResponse 对象。

  • 返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。

  • 返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。

  • c.返回值是 view_func(request),Django 将不执行后续视图函数之前执行的方法,提前执行视图函数,然后再倒序执行视图函数之后执行的方法。

  • 当最后一个中间件的 process_request 到达路由关系映射之后,返回到第一个中间件 process_view,然后依次往下,到达视图函数。

    实例

    class MD1(MiddlewareMixin):
    def process_request(self, request):
    print(“md1 process_request 方法。”, id(request)) #在视图之前执行

    def process_response(self,request, response): :#基于请求响应
    print(“md1 process_response 方法!”, id(request)) #在视图之后
    return response

    def process_view(self,request, view_func, view_args, view_kwargs):
    print(“md1 process_view 方法!”) #在视图之前执行 顺序执行
    #return view_func(request)

    img

    img

    process_exception

    process_exception 方法如下:

    process_exception(request, exception)
    

    参数说明:

    • request 是 HttpRequest 对象。
    • exception 是视图函数异常产生的 Exception 对象。

    process_exception 方法只有在视图函数中出现异常了才执行,按照 settings 的注册倒序执行。

    在视图函数之后,在 process_response 方法之前执行。

    process_exception 方法的返回值可以是一个 None 也可以是一个 HttpResponse 对象。

    返回值是 None,页面会报 500 状态码错误,视图函数不会执行。

    process_exception 方法倒序执行,然后再倒序执行 process_response 方法。

    返回值是 HttpResponse 对象,页面不会报错,返回状态码为 200。

    视图函数不执行,该中间件后续的 process_exception 方法也不执行,直接从最后一个中间件的 process_response 方法倒序开始执行。

    若是 process_view 方法返回视图函数,提前执行了视图函数,且视图函数报错,则无论 process_exception 方法的返回值是什么,页面都会报错, 且视图函数和 process_exception 方法都不执行。

    直接从最后一个中间件的 process_response 方法开始倒序执行:

    实例

    class MD1(MiddlewareMixin):
    def process_request(self, request):
    print(“md1 process_request 方法。”, id(request)) #在视图之前执行

    def process_response(self,request, response): :#基于请求响应
    print(“md1 process_response 方法!”, id(request)) #在视图之后
    return response

    def process_view(self,request, view_func, view_args, view_kwargs):
    print(“md1 process_view 方法!”) #在视图之前执行 顺序执行
    #return view_func(request)

    def process_exception(self, request, exception):#引发错误 才会触发这个方法
    print(“md1 process_exception 方法!”)
    # return HttpResponse(exception) #返回错误信息

    img

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lipenghandsome/article/details/108483845

智能推荐

vue:proxy反向代理配置_fankse的博客-程序员秘密

在axios配置请求时配置代理环境个人感觉还有些问题,但不影响使用,若有大佬路过,希望可以在评论区指正一下

移动端下滑加载,记录原滚动位置,跳到详情页返回保留数据。_小杰~的博客-程序员秘密_移动端下滑展示数据是什么功能

移动端下滑加载,记录原滚动位置,跳到详情页返回保留数据。使用sessionStorage 方法sessionStorage存储的数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。 var pagesize=15;//每页数据条数 var loading = false; //状态标记 var page = 1; var maxpage; function ajaxpag

安装Linux交叉编译器_cHeN_jUiOr的博客-程序员秘密_离线交叉编译

不同的Linux系统操作可能不一样,若有错误,请指出

Linux应用进程消失之谜--Java进程与OOM Killer_mywayhome的博客-程序员秘密

“Java进程咋又突然没了?还没任何报错,都好几天了好奇怪啊。”上午刚上班不久,旁边的同事就遇到了棘手的技术问题。大概打听下,原来是某个Java应用在执行某个耗时的定时任务的过程中,大概率进程会突然退出,而且应用日志、中间件日志都找不到任何异常。听起来还挺有意思,我默默地登上了出问题的docker容器。0x01 OOM killer登上机器后,查看应用和中间件日志,确实没有看到问题。我怀疑是...

Java面试必问的HashMap,java面试自我评价_普通网友的博客-程序员秘密

一、服务发布简介分布式系统架构下,服务发布是一件很麻烦的事情,特别是在构建自动发布流程和灰度测试的策略两个核心方面。通常情况下如果不涉及数据层面的灰度流程,服务可以灰度上线,或者滚动上线,这两种方式很常用;如果涉及到数据灰度,则可能需要中间服务做不同版本数据之间追平,或者停机维护一次性处理好数据和上线问题,不过后面这种方式风险较大。二、蓝绿部署新版本上线的时候,并不停掉老版本,新旧两个版本同时运行,通常还会在负载均衡的策略上倾向于旧版本服务处理请求,这样新版本就有一个执行的观察期过渡期,等到新版本平

随便推点

mysql 乱码解决办法---创建数据库时指定字符集_嘟嘟xo的博客-程序员秘密

mysql 创建数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题。我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来很多mysql数据库工具(除了phpmyadmin,我偶尔用,功能强速度慢)都不支持创建时指定数据库编码,当然可以改my.ini来解决这个问题,但是需要重新启动mysql,不过用

Mathematica分形源码_普通网友的博客-程序员秘密

Mandelbrot分形:Mandelbrot[zc_] := Module[{z = 0, i =0}, While[i < 100 && Abs[z] < 2, z = z^2 + zc; i++]; i];DensityPlot[Mandelbrot[xc + I yc], {xc, -2,1}, {yc, -1.5, 1.5}, PlotPoints ->...

SQLite多线程下的并发操作_Bestrem_9的博客-程序员秘密_数据库多线程写是否需要锁

<br />这两天一直在捣鼓SQLite数据库,基本的操作就不说了,比较简单,打算有空的话另起一篇博文简单总结一下。<br />这里主要想探讨一下多路并发下的数据库操作<br />SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据操作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。<br />如果有朋友想了解SQLite相关的锁定机制,可以看看我转载的博文sqlite的事

Swift2.1关键字 @noescape介绍_offbye的博客-程序员秘密

@noescape优化编译器编译,swift 2.1引入。函数如果有一个一个参数是closure的话,可以在前面加一个关键字@noescape表示在函数return前closure生命周期结束,可以优化编译。(closure 是引用类型, 可以引用到别的地方,如下:)class A{ var b: (Void -> Void)! func lalala(a: (Void->Voi

Idea 配置文件 提示 URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)_苟梦不苟的博客-程序员秘密_idea导入项目 uri未注册

Idea导入项目提示URI is not registered (Settings | Languages &amp; Frameworks | Schemas and DTDs)统一资源标识符没有注册解决步骤: 1.File--&gt;Settings2.Languages&amp;Frameworks ——&gt; Schemas and DTDs完美解决!!!...

CCNP考试介绍_cracker_love的博客-程序员秘密_ccnp 考试 csdn

CCNP考试介绍           CCNP(Cisco Certified Network Professional)是在CCNA的基础之上的一项思科职业资格认证,获得CCNP资格的专业人员将具有100到500多个节点的大型企业网络安装、配置和运行LAN、WAN及拔号访问业务的能力;但CCNP资格的取得是必须在取得CCNA资格的前提之上的,这一点与CCIE对考生的资格没有任何要求是不同的,其考

推荐文章

热门文章

相关标签