深入解析Django中间件调用栈机制:原理与Python实现Demo

慢慢来
慢慢来
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析Django中Request/Response模式下的中间件调用栈(Call Stack)机制。通过剖析中间件类的__init__与__call__方法,以及process_view、process_exception等可选钩子函数的执行顺序,阐明请求由外至内、响应由内至外的传递过程。同时,提供一个基于Python的简化Demo,直观展示多层中间件如何协作处理请求与响应,帮助开发者理解Django核心架构。

Django中间件工作流程概述

1. 工作流程

在Django的Request/Response处理模式中,请求(request)并非直接抵达视图函数(view),视图返回的响应(response)也不会直接发送给客户端浏览器。相反,请求会从外到内逐层穿过所有配置的中间件(middleware)。在此过程中,开发者可以在每一层对request进行预处理。当请求到达最内层时,调用视图函数获取返回的response。随后,该response再由内向外逐层传递,允许开发者在每一层对response进行后处理。具体流程如下图所示:

中间件核心原理与方法解析

2. 原理


class SimpleMiddleware:
 def __init__(self, get_response):
  self.get_response = get_response
  # One-time configuration and initialization.
 
 def __call__(self, request):
  # Code to be executed for each request before
  # the view (and later middleware) are called.
 
  response = self.get_response(request)
 
  # Code to be executed for each request/response after
  # the view is called.
 
  return response

每个中间件类通常包含两个核心方法:(1)__init__(self, get_response):该方法在Web服务器启动时执行初始化操作,主要作用是建立与下一层中间件的连接(即保存get_response引用)。(2)__call__(self, request):该方法在每次接收到HTTP请求时被调用,负责执行具体的中间件逻辑。

此外,中间件还可以实现三个可选方法:(1)process_view:__init__和__call__本身不直接感知视图函数的存在,但process_view允许在调用视图函数之前访问视图函数及其参数。如果定义了此方法,它将在__call__内部、self.get_response(request)调用之前执行,从而有机会触发或修改视图调用。(2)process_exception:当视图函数执行过程中抛出异常时,该方法提供处理异常的机会。(3)process_template_response:在self.get_response(request)调用完成且视图函数结束后执行,用于修改返回的response。需要注意的是,此方法仅在视图返回TemplateResponse实例时生效;若视图返回的是render()生成的HttpResponse,则该钩子不会被触发。

更多详细信息请参阅Django官方文档:https://docs.djangoproject.com/en/3.1/topics/http/middleware/

Call Stack机制Python实现Demo

(3)用于进一步理解Call Stack机制的小型Python Demo(仅供参考)


import time
class Base:
 def __init__(self,get_response):
  self.get_response=get_response
 def __call__(self,request=None):
  self.pre()
  response=self.get_response(request)
  self.after()
  return response
 def pre(self):
  pass
 def after(self):
  pass
class Response:
 def __init__(self):
  pass
def view(request):
 return Response()
def startServer(callstackSets,view):
 callstackSets.reverse()
 last=callstackSets.pop(0)(view)
 for i in range(len(callstackSets)):
  last=callstackSets.pop(0)(last)
 return last
class A(Base):
 def pre(self):
  print('In A')
 def after(self):
  print('Out A ')
class B(Base):
 def pre(self):
  print('In B')
 def after(self):
  print('Out B ')
class C(Base):
 def pre(self):
  print('In C')
 def after(self):
  print('Out C ')
if __name__=='__main__':
 callstackSets=[A,B,C]
 calls=startServer(callstackSets,view)
 calls('req')

运行上述Demo后的输出结果如下:

从输出可以看出,系统成功实现了预定目标:请求进入后,逐层向下传递(In A -> In B -> In C),到达最内层C后调用视图函数获取响应,随后响应逐层向上返回(Out C -> Out B -> Out A),完整体现了中间件栈的调用与返回过程。

至此,关于理解Django中Call Stack机制的小Demo介绍完毕。如需了解更多Django Call Stack机制相关内容,请搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。