知其然,知其所以然
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 权限装饰器 真实验证 动画演示
Django 2026-09-30

Session 的数据库、缓存、签名 Cookie 存储方式

实测 Session 的五种存储后端:数据各放在哪里(表 / 缓存 / 文件 / cookie);signed_cookies 的数据不保密、超过 4 KB 浏览器丢弃(8000 字符 → 6231 字节);读写耗时:db 读 0.26 / 写 0.83 ms,cache 读 0.09 / 写 0.12 ms。

Django session 存储后端 缓存 真实验证 动画演示
Django 2026-09-30

密码修改后为什么会让其他设备下线

实测改密码为什么让其他设备下线:session 里的 _auth_user_hash 由密码哈希派生,每个请求重新比对;改密码后所有会话失效(含当前),用 update_session_auth_hash 保住当前设备;把同一明文重新哈希也会踢掉所有会话;只改 last_login 不影响。

Django session 密码修改 安全 真实验证 动画演示
Django 2026-09-30

Django Messages Framework 的存储机制

实测 Django 消息框架:默认 FallbackStorage 先放 cookie(用完即删,读完 cookie 被置为过期);默认最低级别 INFO,debug() 被丢弃;只有遍历才算用过;随机内容下 cookie 放不下时(2 条 × 3000 字符)转存到 session;三种存储各自放哪里。

Django messages 消息框架 cookie 真实验证 动画演示
Django 2026-09-30

Django Template Loader 加载顺序

实测 Django 模板加载器:同名模板时 DIRS 优先、再按 INSTALLED_APPS 顺序;TemplateDoesNotExist 的 tried 列表列出所有尝试位置;cached 加载器让每次 get_template 从 1.17 ms 降到 0.0010 ms,且 DEBUG 开关不影响默认使用 cached。

Django 模板 Template Loader 真实验证 动画演示
Django 2026-09-30

Context Processor 的执行过程

实测上下文处理器:只对 RequestContext(render(request, …))运行、render_to_string 不带 request 时不运行;每次渲染各运行一遍(include 不重复);后面的覆盖前面的、视图 context 优先;一个 5 ms 的处理器让空模板渲染从 0.010 ms 变成 6.41 ms。

Django 模板 Context Processor 真实验证 动画演示
Django 2026-09-30

模板自动转义与 safe

实测 Django 模板自动转义:五个字符的转义结果;safe / mark_safe / autoescape off;safe 之后接 upper 会再次被转义;href=javascript: 不会被拦截、<script> 里的变量需要 json_script;不加引号的属性可被截断;format_html 安全而 mark_safe + 拼接是 XSS。

Django 模板 自动转义 XSS 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号