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

FormSet 与 InlineFormSet

实测 FormSet 与 InlineFormSet:ManagementForm 的字段与缺失时的错误(missing_management_form);min_num / max_num / validate_min / validate_max / can_delete;inline 自动关联父对象;10 个表单的外键下拉框渲染发出 11 次查询(N+1)。

Django FormSet InlineFormSet 真实验证 动画演示
Django 2026-09-30

文件上传的内存与临时文件机制

在 gunicorn 上实测文件上传:默认 FILE_UPLOAD_MAX_MEMORY_SIZE=2.5 MiB,≤ 阈值是 InMemoryUploadedFile、超过是磁盘上的 TemporaryUploadedFile;200 MiB 上传 worker 峰值 46 MiB(落盘)vs 246 MiB(阈值调大后留在内存);FILE_UPLOAD_TEMP_DIR 指定临时目录。

Django 文件上传 内存 临时文件 gunicorn 真实验证 动画演示
Django 2026-09-30

上传文件大小限制

实测 Django 的上传大小限制:没有单文件上限(30 MiB 也接受);表单里检查 file.size 发生在文件收完之后;DATA_UPLOAD_MAX_MEMORY_SIZE 不计文件字段(10 MiB 文件通过、3 MiB 普通字段被拒);DATA_UPLOAD_MAX_NUMBER_FILES 默认 100,101 个抛 TooManyFilesSent。

Django 文件上传 大小限制 真实验证 动画演示
Django 2026-09-30

CSRF Token 的生成、校验与轮换

实测 CSRF:cookie 里是 32 位 secret(不变),表单 token 是 64 位且每次不同(掩码);缺 token / 错 token / 缺 cookie 都是 403,请求头 X-CSRFToken 可用;通过 login() 登录会轮换 cookie 并使旧表单 token 失效,logout 不轮换。

Django CSRF 安全 真实验证 动画演示
Django 2026-09-30

Django 用户认证流程

实测 Django 用户认证流程:request.user 是惰性的(不访问则 0 次查询,访问一次 2 次:session + user);authenticate 依次尝试后端、失败发 user_login_failed(信号里的凭据只保留键名);登录后 session 只存用户 id、后端路径和密码派生的 hash。

Django 认证 session authenticate 真实验证 动画演示
Django 2026-09-30

Session 登录状态如何保存

实测 Session 默认(数据库后端)如何保存登录状态:只读不创建 session、写入才发 Set-Cookie;session 表的 key / data / expire_date;每个请求 1 次 SELECT、修改再 UPDATE;默认固定 14 天过期;过期行不会自动清理,需要 clearsessions。

Django session 登录状态 真实验证 动画演示
Django 2026-09-30

login()、logout() 的内部过程

实测 login() / logout() 的内部:匿名登录时 session_key 换新、数据保留、旧行被删(防会话固定);换用户登录会清空 session;logout 清空并删除 session 行;login 顺带写 last_login,断开 update_last_login 信号可省一次写。

Django login logout session 真实验证 动画演示
Django 2026-09-30

密码哈希算法与密码校验成本

实测 Django 密码哈希:默认 pbkdf2_sha256 迭代 1,500,000 次,本机单次校验 162 ms;argon2 26 ms、bcrypt 218 ms、scrypt 160 ms;旧算法密码登录后自动升级;用户不存在时也会哈希一次,耗时与「密码错」接近。

Django 密码哈希 PBKDF2 Argon2 真实验证 动画演示
Django 2026-09-30

自定义 User Model 的正确时机

实测自定义 User Model 的时机:一开始设置 AUTH_USER_MODEL,库里没有 auth_user 表;项目已迁移后再切换,migrate 报 InconsistentMigrationHistory(admin.0001 先于 lab.0001 已应用);只想加字段时用 OneToOne Profile 即可。

Django 自定义User AUTH_USER_MODEL 迁移 真实验证 动画演示
Django 2026-09-30

自定义认证后端

用三个带日志的认证后端(Token / ModelBackend / Email)实测 AUTHENTICATION_BACKENDS:按顺序尝试、第一个成功的胜出;PermissionDenied 终止后续;多后端时 login() 需要 backend 参数;session 记录后端路径,后端被移除后用户静默变成匿名。

Django 认证后端 authenticate 真实验证 动画演示
Django 2026-09-30

Groups、Permissions 与权限检查

实测 Django 权限:每个模型 add/change/delete/view 四个默认权限 + Meta.permissions;has_perm 在同一个 user 对象上缓存(授予权限后仍返回 False,重新取用户才 True);超级用户与不活跃用户;默认后端不支持对象级权限。

Django 权限 Groups Permissions 真实验证 动画演示
Django 2026-09-30

login_required 与权限装饰器

实测 login_required / permission_required / user_passes_test 与对应的 Mixin:匿名 302 到 LOGIN_URL?next=…;已登录但无权限时装饰器默认又重定向到登录页(raise_exception=True 才是 403),Mixin 则是 403;next 的安全判断。

Django login_required 权限装饰器 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号