process_response 函数是执行完 views.py 后执行的函数

process_response 函数有两个参数,一个是 request,一个是 response,response 是视图函数返回的响应对象

process_response 函数的返回值必须是 HttpResponse 对象

middleware_test.py:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse class Test(MiddlewareMixin):
def process_request(self, request):
print("这是一个中间件 --> test") def process_response(self, request, response):
print("这里是 Test 的 HttpResponse")
return HttpResponse("这是 Test 返回的 HttpResponse") class Test2(MiddlewareMixin):
def process_request(self, request):
print("这是一个中间件 --> test2") def process_response(self, request, response):
print("这里是 Test2 的 HttpResponse")
return HttpResponse("这是 Test2 返回的 HttpResponse")

views.py:

from django.shortcuts import HttpResponse

def index(request):
print("这里是 index 页面")
return HttpResponse("这里是主页面 index")

访问,http://127.0.0.1:8000/index/

这里没有返回 index 函数中的内容,而是直接返回 process_response 中的内容

执行结果:

可以看到先执行 process_request,然后执行 views.py,最后执行 process_response

而且 process_request 按照中间件的顺序执行,而 process_response 是反着执行的

process_request 和 process_response 的执行流程:

中间件收到 request 请求后,先执行 process_request 函数,当返回响应时,再执行 process_response 函数

当 process_request 函数返回 HttpResponse 时,就不再执行后面的 process_request 函数,而会去执行 process_response 函数

如上图,中间件 3 返回了 HttpResponse,所以不再执行中间件 4、5、6 的 process_request 函数和 process_response 函数,而是继续执行中间件 3、2、1 的 process_response 函数

middleware_test.py:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse allow_url = ['/admin/', '/uploads/', '/files/'] class Test(MiddlewareMixin):
def process_request(self, request):
print("这是一个中间件 --> test") def process_response(self, request, response):
print("这里是 Test 的 HttpResponse")
return HttpResponse("这是 Test 返回的 HttpResponse") class Test2(MiddlewareMixin):
def process_request(self, request):
print("这是一个中间件 --> test2")
if request.path_info in allow_url:
return
else:
return HttpResponse("--- Test2 ---") def process_response(self, request, response):
print("这里是 Test2 的 HttpResponse")
return HttpResponse("这是 Test2 返回的 HttpResponse")

访问,http://127.0.0.1:8000/index/

运行结果:

因为 Test2 中 process_request 中返回了 HttpResponse,所以这里只执行了 Test2 的 process_response 方法,而不再去执行后面的中间件 Test1

最新文章

  1. 《TypeScript 中文入门教程》 1、基础数据类型
  2. 源码解析-Volley(转自codeKK)
  3. elasticsearch同义词及动态更新
  4. XAF ObjectSpace保存时添加记录
  5. .NET技术在中国为什么老被人嫌弃
  6. MVC 修饰标签
  7. Notification通知
  8. <转>如何改变讨好型人格 | 你根本不需要讨好任何人
  9. 洛谷P1458 顺序的分数 Ordered Fractions
  10. FileObverse文件观察者的Debug报告
  11. MFC 消息的分类
  12. Android ListView 单条刷新方法实践及原理解析
  13. Alpha阶段Scrum Meeting合集(江山代有才人秃队)
  14. mvc部分视图转换成html字符串
  15. 关于Xilinx AXI Lite 源代码分析---自建带AXI接口的IP
  16. img标签在div里上下居中
  17. Java转python第一天
  18. Revit API过滤元素类别(FamilySymbol与FamilyInstance)
  19. 【教程】ubuntu下安装samba服务器
  20. 递归、字节流、文件复制_DAY20

热门文章

  1. Chrome出现“浏览器由所属组织管理”如何解决
  2. 《剑指Offer》-006 - Java版快速幂 -解决n的m次方的问题
  3. html中的数据岛:利用DSO和javascript在html中动态加载和浏览xml数据
  4. iOS 应用逆向工程分析流程图
  5. python--简单的文件断点续传实例
  6. python-hashlib加密
  7. template-web.js 自定义过滤器
  8. my OD
  9. podium layout 说明
  10. Xml与Map之间的相互转换