Django中Middleware中的函数详解
作者:高速公路不懂爱 发布时间:2023-08-30 06:58:30
一个middleware的例子
import time
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
class TimeItMiddleware(MiddlewareMixin):
def process_request(self, request):
return
def process_view(self, request, func, *args, **kwargs):
if request.path != reverse('index'):
return None
start = time.time()
response = func(request)
costed = time.time() - start
print('process view: {:.2f}s'.format(costed))
return response
def process_excepttion(self, request, exception):
pass
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
return response
middleware中的函数有:
process_request
process_view
process_tmplate_response
process_response
process_exception
下面分别进行介绍:
process_request:
这是请求来到 middleware 中时讲入的第一个方法。一般情优下,我们以在这里做一些校验,比如用户登录或者 HTTP 中是否有认证头之类的验证.这个方法可以有两种返回值 HttpResnonse 或者None,如果返回 HttpResponse,那么接下米的处理方法只会执行 process_response,其他方法将不会被执行。这里需要注意的是,如果你的 middleware 是 settings 配置的 MIDDLEWARE 的第一个,那么剩下的 middleware 也不会被执行;如果返回 None,那么 Diango会继续执行其他方法。
process_view:
这个方法是在 process_request 方法之后执行的,参数如上面代码所示,其中 func 就是我们将要执行的 view 方法。因此,如果要统计一个view的执行时间,可以在这里做。它的返回值跟 process_request 一样,是HttpResponse 或者 None,其逻辑也一样。如果返回 None,那么 Django 会帮你执行 view 函数,从而得到最终的 response。
Process_template_response:
执行完上面的方法,并且 Django 帮我们执行完 view,拿到最终的 response 后,如果使用了模板的 response (这是指通过 return render(request,'index.html',context={})方式返回的 response),就会来到这个方法中。 在这个方法中,我们可以对 response 做一下操作,比如 Content-Type 设置,或者其他 header 的修改/增加。
process_response:
当所有流程都处理完毕后,就来到了这个方法。这个方法的逻辑跟 process_template_response是完全一样的,只是后者是针对带有模板的response的处理。
process_exception:
上面的处理方法是按顺序介绍的,而这个方法不太一样。只有在发生异常时,才会进入这个方法。哪个阶段发生的异常呢?
可以简单理解为在将要调用的 View 中出现异常(就是在process_view 的 func 函数中)或者返回的模板 response 在渲染时发生的异常。但是需要注意的是,如果你在process_view 中手动调用了 func,就像我们上面做的那样,就不会触发 process_exception 了。这个方法接收到异常之后,可以选择处理异常,然后返回一个含有异常信息的 HttpResponse,或者直接返回 None 不处理,这种情况下 Django会使用自己的异常模板。
以上节选自《Django企业开发实战》 胡阳著。
来源:https://segmentfault.com/a/1190000019784702


猜你喜欢
- 主要步骤:import shutilshutil.copyfile(old_image,new_image)完整:这里要做的是,将原图片复制
- 可以使用numpy中的linspace函数np.linspace(start, stop, num, endpoint, retstep,
- 下面先给大家介绍python实现版本号对比功能,具体内容如下所示:相同位置版本号大小比较:def abc(str1, str2): &nbs
- 经常需要通过python代码来提取文本的关键词,用于文本分析。而实际应用中文本量又是大量的数据,如果使用单进程的话,效率会比较低,因此可以考
- django台后默认上传文件名在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileFiel
- 1、python-pptx模块简介使用python操作PPT,需要使用的模块就是python-pptx,下面来对该模块做一个简单的介绍。这里
- 在django的views中不论是用类方式还是用装饰器方式来使用rest框架,django_rest_frame实现权限管理都需要两个东西的
- 计算交并比:交的面积除以并的面积。要求矩形框的长和宽应该平行于图片框。不然不能用这样的公式计算。原理,从一维上来理解:两条红线的距离之和减去
- The Only Thing We Have To Fear Is Premature Standardization原文地址:http:/
- Yolov5如何更换BiFPN?第一步:修改common.py将如下代码添加到common.py文件中# BiFPN # 两个特征图add操
- 我就废话不多说了,大家还是看代码吧! import PyPDF2 import repdf_file = open('xxx.pdf
- 看了OReilly.JavaScript.The.Definitive.Guide.5th.Edition.Aug.2006里的cookie
- 本文主要讨论了python中getpass模块的相关内容,具体如下。getpass模块昨天跟学弟吹牛b安利Python标准库官方文档的时候偶
- 本文实例讲述了Python 私有化操作。分享给大家供大家参考,具体如下:私有化xx: 公有变量_x: 单前置下划线,私有化属性或方法,fro
- Go语言中,一般方法接收者和接口方法接收者有一定区别在一般方法中若定义的接收者是值,可以使用值或者指针进行调用;若定义的接收者是指针,可以使
- 网易云音乐排行榜歌曲及评论爬取主要注意问题:selenium 模拟登录、iframe标签定位、页面元素提取。在利用selenium定位元素并
- 在 MySQL 中,EXPLAIN 命令是一种非常重要的查询优化工具,它可以帮助我们分析 SQL 查询语句的执行计划,以及如何优化它们。在使
- 今天同学向我提了一个问题,我觉得蛮有意思,现记录下来大家探讨下。问题是:在一个表里面,有一个允许为空的字段,空是可以重复的,但是不为空的值需
- 本文实例讲述了python基于BeautifulSoup实现抓取网页指定内容的方法。分享给大家供大家参考。具体实现方法如下:# _*_ co
- 字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对