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

异步 ORM 查询限制

异步 ORM 的限制(Django 6.1.1 / PostgreSQL):外键懒加载与反向关系遍历要用 select_related / async for;async 里没有异步事务;a 前缀方法底层是线程里的同步查询,所以 10 个并发 async 查询排队执行(≈2030 ms、1 个连接)。

Django 异步 ORM 事务 PostgreSQL 真实验证 动画演示
Django 2026-09-30

同步 Middleware 对异步请求的影响

同步中间件在 ASGI 下会被适配到线程里:400 次串行请求,没有中间件 0.536 ms → 1 个 sync 中间件 0.681 ms(+0.15 ms),5 个 sync 也只有 0.685 ms;DEBUG 日志会记录 adapted;20 并发下 sync 中间件里 sleep 并不会让请求排队(420 ms vs 413 ms)。

Django 中间件 ASGI 异步 真实验证 动画演示
Django 2026-09-30

长连接与 Streaming Response

流式响应要让生成器类型与服务器匹配:uvicorn + async 生成器首批 307 ms、5 批分开到达;uvicorn + sync 生成器和 gunicorn + async 生成器都被缓冲到 1526 ms 才一起到,并有警告;客户端断开时 async 生成器的 finally 会执行;uvicorn 单进程 30 个长流 1520 ms,gunicorn 同步 worker 6 个长流 9045 ms。

Django StreamingHttpResponse SSE ASGI 真实验证 动画演示
Django 2026-09-30

Django 中的并发计数问题

10 个线程各 +1 共 200 次(期望 2000):get → n += 1 → save() 只剩 347、外面包 atomic 只剩 250;F() 表达式 update、select_for_update、save() 配 F() 都精确得到 2000(414 / 810 / 850 ms)。

Django 并发 F表达式 select_for_update PostgreSQL 真实验证 动画演示
Django 2026-09-30

数据库事务与异步任务的边界

事务与异步任务的边界:任务在 atomic 里入队后,提交前还有 50 ms 工作时 worker 40/40 查不到订单;立刻提交或 on_commit 入队时 200/200 查到(窗口很短的情形没有复现竞态);worker 加重试可以补救。

Django 事务 异步任务 竞态 PostgreSQL 真实验证 动画演示
Django 2026-09-30

transaction.on_commit() 配合异步任务

transaction.on_commit 的规则:提交后按注册顺序执行,autocommit 时立即执行;回调抛异常时默认中断后续回调(数据已提交),robust=True 记录日志并继续;savepoint 回滚会丢弃回调;TestCase 里回调不执行,要用 captureOnCommitCallbacks。

Django 事务 on_commit 异步任务 测试 真实验证 动画演示
Django 2026-09-23

QuerySet 怎么编译成 SQL:filter() 链式调用为什么不查库,select_related 又是怎么把 N+1 变成 1 次的

用 bigywater 项目自己的 Post/Series 模型真实实测:filter()/exclude() 链式调用真实执行 SQL 条数是 0、每次 filter() 都返回全新对象互不影响、str(query) 因为缺失引号而不是真实发给数据库的那份、跨关系过滤真实生成 INNER JOIN、不用 select_related 真实触发 6 条 SQL 的 N+1 而加上后变成 1 条,对照 QuerySet 惰性求值与 SQLCompiler 编译的真实源码。

QuerySet N+1 动画演示
Django 2026-09-17

as_view():一个类怎么变成一个函数视图,dispatch() 又是怎么反射调出对应方法的

本机真实实测 as_view() 每次请求都新建一个实例、参数校验发生在注册阶段而不是请求阶段、dispatch() 靠 getattr 反射分派方法且未定义的方法真实走 405、get 没定义 head 会自动复用、混用同步异步 handler 真实报错,以及装饰器加在 dispatch 上属性会被复制到最外层函数。

CBV as_view 动画演示
Django 2026-09-16

事务与 on_commit():post_save 信号里干的事,可能比事务提交还早发生

本机真实实测 on_commit() 在没有事务时会立刻执行、嵌套 atomic() 用 savepoint 隔离回滚、内层回滚会让注册在其中的 on_commit 回调被直接丢弃,以及用 bigywater 项目自己的 Post 模型证明 post_save 信号在事务提交前就已经真实执行,回滚后数据库记录消失但信号写的文件还留在磁盘上。

事务 on_commit 动画演示
Django 2026-09-15

Forms 校验流水线:一个字段挂了,其它字段会不会被跳过?clean() 里忘记判空为什么会真实抛 KeyError

本机真实实测 Django Form 校验是收集所有字段错误而不是遇到第一个就停、一个字段身上多个 validator 的失败会被一次性收集、Form.clean() 里直接用下标取 cleaned_data 会真实抛 KeyError,以及 errors 惰性缓存的真实行为。

Forms 校验 动画演示
Django 2026-09-14

Migrations:makemigrations 到底在跟什么比,一次字段改名为什么会被当成删了又加

本机真实实测 makemigrations 从不查真实数据库、非交互模式下字段改名被当成删+加直接放弃、跨 app 迁移依赖图决定真实执行顺序、SQLite 加字段是否走快速 ALTER TABLE 与 --fake 的真实效果。

Migrations 依赖图 动画演示
Django 2026-09-13

Signal:receiver 什么时候会被悄悄丢弃,一个抛异常的接收者又会不会打断整条广播

本机真实实测没保留引用的 receiver 被立刻回收、同一 receiver 注册两次信号触发两次(dispatch_uid 修复)、send() 遇异常中断广播而 send_robust() 跑完全部接收者,对照 pre_save/post_save 真实源码。

Signal 弱引用 动画演示
京ICP备2026067502号-1京公网安备11010502063487号