知其然,知其所以然
Django 2026-09-30

App Registry:INSTALLED_APPS 如何加载应用

实测 Django 应用注册表:apps_ready / models_ready / ready 三个标志在 models 导入时与 ready() 里各是什么值;setup() 前使用会怎样;重复 label、不存在的 app 的报错原文;AppConfig 自动发现遇到多个子类且都没标 default 时会悄悄退回基类。

Django App Registry INSTALLED_APPS 真实验证 动画演示
Django 2026-09-30

AppConfig.ready() 的执行时机与常见陷阱

实测 AppConfig.ready():按 INSTALLED_APPS 顺序调用、调用时所有模型已加载;所有 manage.py 命令都会触发;runserver 默认自动重载会调用 2 次(来自 2 个进程);在 ready() 里查还不存在的表会让 migrate 自己失败。

Django AppConfig ready 真实验证 动画演示
Django 2026-09-30

URL Resolver 匹配顺序

实测 Django URL Resolver:第一个匹配的模式胜出、转换器的边界、include() 的命名空间;APPEND_SLASH 下 POST 无斜杠在 DEBUG=False 时静默 301 丢体;匹配是线性扫描(N=5000 时匹配最后一个 712 µs)。

Django URL 路由 真实验证 动画演示
Django 2026-09-30

reverse() 如何生成 URL

实测 reverse():args / kwargs / 字符串参数的行为与 NoReverseMatch 的报错原文;自定义转换器的 to_url;同名同参数时后定义的胜出;命名空间;第一次调用要建反向字典(N=5000 时 140 ms),之后每次约 7.8 µs。

Django URL reverse 真实验证 动画演示
Django 2026-09-30

Middleware 如何处理异常和短路响应

用三层带日志的中间件实测:正常请求的进入/返回顺序、某层短路后内层与视图不执行、视图或中间件抛异常时每一层看到的是 500 响应而不是异常(DEBUG 只改变响应正文)。

Django Middleware 异常 真实验证 动画演示
Django 2026-09-30

process_view、process_exception、process_template_response 的执行位置

用日志实测 process_view、process_exception、process_template_response 三个中间件钩子的调用位置与顺序:process_view 按声明顺序、后两者反向;process_view 返回响应会跳过视图;process_exception 第一个返回响应的会终止链;TemplateResponse 在所有钩子之后才渲染。

Django Middleware 钩子 真实验证 动画演示
Django 2026-09-30

HttpRequest 与请求体解析

实测 HttpRequest 的请求体:body / POST / read() 三种读取的先后顺序在 urlencoded、multipart、JSON 下各是什么结果(read() 之后 POST 会静默为空);PUT / PATCH 不解析 POST;DATA_UPLOAD_MAX_MEMORY_SIZE 默认 2.5 MiB 超过一字节即被拒。

Django HttpRequest 请求体 真实验证 动画演示
Django 2026-09-30

QueryDict 与重复参数

实测 QueryDict:重复参数下 q[key]、get、getlist、dict()、q.dict() 各返回什么;默认不可变、copy() 后才能改;GET / POST 里同样只有 getlist 能取全部;字段数上限 1000,超过一个即 TooManyFieldsSent。

Django QueryDict 请求参数 真实验证 动画演示
Django 2026-09-30

HttpResponse、JsonResponse 与响应头

实测 HttpResponse / JsonResponse:默认头与 charset;响应头大小写不敏感且后写覆盖;JsonResponse 对 datetime / Decimal / UUID 的编码与 safe=False 的含义;响应头里的换行会被 BadHeaderError 拒绝;Content-Length 由 CommonMiddleware 补上。

Django HttpResponse JsonResponse 真实验证 动画演示
Django 2026-09-30

StreamingHttpResponse 流式响应

在 gunicorn 上实测 StreamingHttpResponse:同样 5 段、每段 0.3 s,HttpResponse 首字节 1507 ms,流式 304 ms;200 MiB 响应的 worker 峰值内存 241 MiB vs 43 MiB;流式响应没有 .content 也没有 Content-Length。

Django StreamingHttpResponse 流式响应 真实验证 动画演示
Django 2026-09-30

条件 GET、ETag 与 Last-Modified

实测条件 GET:ConditionalGetMiddleware 自动 ETag 只省带宽、视图照常执行;@condition 用 etag / last_modified 函数提前判断,命中时不执行视图(调用次数不增);If-None-Match 与 If-Modified-Since 的各种取值的结果,POST 带命中的 If-None-Match 得到 412。

Django HTTP缓存 ETag 条件请求 真实验证 动画演示
Django 2026-09-30

WSGI 与 ASGI 启动流程对比

对比 wsgi.py 与 asgi.py 的启动:导入即 django.setup() 并构建中间件链;调用约定 (environ, start_response) vs (scope, receive, send);同步视图与 async 视图在两种入口下分别运行在哪个线程;Django 自带的 ASGIHandler 收到 lifespan 事件会抛 ValueError。

Django WSGI ASGI 启动 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号