楼主: jxapp_51893
24 0

Django 生命周期全流程图 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-11-19
最后登录
2018-11-19

楼主
jxapp_51893 发表于 2025-11-19 14:50:51 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Django 完整生命周期分析

本文基于 Django 3.1.6 源码,探讨了从 HTTP 请求到达至响应返回客户端的整个过程,以及在此过程中数据库连接的管理机制。

一、Django 完整生命周期概览

  1. HTTP 请求生命周期(Request → Response)

    展示了从接收请求到生成响应的全过程。

    ┌───────────────────────────────┐
    │         Web Server(Nginx)    │
    └───────────────┬───────────────┘
                    │
                    ▼
    ┌───────────────────────────────┐
    │        WSGI Server(Gunicorn)  │
    └───────────────┬───────────────┘
                    │env
                    ▼
    ┌───────────────────────────────┐
    │     Django WSGIHandler        │
    │   (django.core.handlers.wsgi) │
    └───────────────┬───────────────┘
                    │构建Request对象 
                    ▼
    ┌──────────────────────────────────────────┐
    │       中间件(process_request)          │
    │ M1 → M2 → ... → Mn                       │
    └───────────────┬──────────────────────────┘
                    │匹配 URL
                    ▼
    ┌───────────────────────────────┐
    │         URL Resolver           │
    └───────────────┬───────────────┘
                    │路由到视图
                    ▼
    ┌───────────────────────────────┐
    │             视图               │
    │    打开数据库连接(懒加载)    │
    │    执行业务逻辑                │
    └───────────────┬───────────────┘
                    │生成 Response
                    ▼
    ┌──────────────────────────────────────────┐
    │       中间件(process_response)         │
    │ Mn → ... → M2 → M1                       │
    └───────────────┬──────────────────────────┘
                    │处理异常/模板渲染
                    ▼
    ┌───────────────────────────────┐
    │        WSGIHandler 返回响应     │
    └───────────────┬───────────────┘
                    │
                    ▼
    ┌───────────────────────────────┐
    │      Gunicorn → Nginx → 客户端 │
    └───────────────────────────────┘
  2. 数据库连接生命周期(懒加载 + 自动管理)

    描述了数据库连接的懒加载特性和自动管理方式。

    请求开始
       │
       │(没有数据库连接,Lazy)
       ▼
    视图第一次触发 ORM 查询
       │
       ▼
    ensure_connection() 建立连接
       │
       │
       ▼
    请求期间复用同一连接
       │
       ▼
    请求结束 → close_if_unusable_or_obsolete()
    │
    ├── CONN_MAX_AGE = 0 → 立即关闭
    │
    ├── CONN_MAX_AGE > 0 → 存活一段时间
    │
    └── CONN_MAX_AGE = None → 长连接

二、生命周期详细解析

1. WSGI 启动阶段

入口文件和核心类定义了如何处理请求。

django/core/handlers/wsgi.py

        class WSGIHandler(BaseHandler):
            def __call__(self, environ, start_response):
                request = WSGIRequest(environ)
                response = self.get_response(request)
    
  • 创建 WSGIRequest 对象
  • 加载所有中间件
  • 数据库连接对象已创建,但未实际连接数据库

2. BaseHandler.get_response()

这是生命周期中的核心调度方法。

django/core/handlers/base.py

load middleware
↓
process_request()
↓
URL resolver
↓
view函数
↓
process_response()
↓
异常处理
↓
返回 Response

3. 中间件(Middleware)执行顺序

Django 按照特定顺序执行中间件,形成洋葱模型。

M1.process_request
M2.process_request
M3.process_request
...

M3.process_response
M2.process_response
M1.process_response

4. URL 路由解析 (URL Resolver)

负责将 URL 匹配到对应的视图函数,并传递必要的参数。

django/urls/resolvers.py

URLResolver.resolve()

5. 视图(View)执行

视图执行时首次与数据库交互。

三、数据库连接管理

Django 使用懒加载技术来管理数据库连接。

1. 第一次访问数据库:cursor()

django/db/backends/base/base.py

        def cursor(self):
            self.ensure_connection()
            return self._cursor()

        def ensure_connection(self):
            if self.connection is None:
                self.connect()
    

确保在首次 ORM 操作时建立数据库连接。

2. 请求结束 → 连接自动回收

在请求结束后,Django 会根据配置自动管理数据库连接。

BaseHandler

CONN_MAX_AGE

根据不同的配置,连接可能在请求结束时立即关闭、超时关闭或保持长连接。

>0

None

四、异常处理流程

如果视图抛出异常,Django 会进行相应的处理。

视图抛异常
↓
process_exception(自下而上)
↓
exception middleware
↓
resolve 500 error handler
↓
生成 Response

五、模板渲染

当视图返回响应时,Django 在中间件层进行模板渲染。

TemplateResponse

response = response.render()

六、生命周期最终阶段

响应完成后,Django 将响应返回给 WSGI 服务器,并清理数据库连接。

七、完整流程图

客户端
   │
   ▼
Nginx
   │
   ▼
Gunicorn/uwsgi
   │WSGI env
   ▼
Django WSGIHandler
   │
   ├── 初始化中间件
   │
   ▼
process_request() 中间件链
   │
   ▼
URL Resolver(匹配路由)
   │
   ▼
View 视图函数
   │
   ├── 第一次 ORM 查询 → 打开数据库连接
   │
   ├── 执行业务逻辑
   │
   ▼
返回 Response
   │
   ▼
process_response() 中间件链
   │
   ▼
Django 回收数据库连接
   │(根据 CONN_MAX_AGE)
   ▼
WSGI Server
   │
   ▼
客户端

八、总结

阶段 行为
WSGI 初始化 未建立数据库连接
process_request 仅处理请求,不访问数据库
视图第一次访问 ORM 建立数据库连接(ensure_connection)
视图期间 始终复用同一连接
process_response 产生最终响应
请求结束 根据 CONN_MAX_AGE 自动管理连接
CONN_MAX_AGE=None 长连接,适合高性能服务
异步任务 必须手动 close_old_connections()
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:django 生命周期 NGO Jan 流程图

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-9 05:32