Django

🌿 Django 避坑大全:性能与安全

Django 开发避坑指南,涵盖 QuerySet 性能优化、N+1 查询解决、迁移冲突处理、ORM 陷阱规避及安全配置,助你写出高效健壮的 Django 代码。

收藏
6.5k
安装
2.1k
版本
1.0.0
CLS 安全扫描中
预计需要 3 分钟...

使用说明

核心用法

本技能系统梳理 Django 开发中的常见陷阱与最佳实践,分为八大模块:

1. QuerySet 延迟执行与性能

  • QuerySet 是惰性求值的,直到迭代、切片或布尔判断时才查询数据库
  • 避免重复查询:如需多次使用结果,先用 list(queryset) 转换
  • exists()bool(queryset) 更高效,不获取完整数据行
  • count() 使用 SQL COUNT,而 len() 会拉取全部数据

2. N+1 查询问题解决

  • select_related:用于 ForeignKey/OneToOne,单次 JOIN 查询
  • prefetch_related:用于 ManyToMany/反向外键,独立查询后缓存
  • 循环中访问关联对象必须预取,否则产生 N+1,建议使用 django-debug-toolbar 检测
  • Prefetch 对象支持自定义查询集,可过滤或注解预取数据

3. ORM 常见陷阱

  • update() 不触发 save(),因此不发送信号、不更新 auto_now
  • 使用 F() 表达式进行数据库级操作,如 F('count') + 1,避免竞态条件
  • exclude(field=None) 会排除 NULL 值,语义可能与预期不符
  • values() 后需用 distinct() 去重,否则可能产生重复行

4. 迁移管理

  • 模型变更后需手动执行 makemigrations,非自动
  • 迁移冲突时重命名避免碰撞,或使用 --merge 合并,--fake 标记已执行
  • squashmigrations 可压缩迁移,但部署完成前保留原迁移

5. 生产环境配置

  • DEBUG=False 时必须设置 ALLOWED_HOSTS,否则崩溃
  • SECRET_KEY 必须保密,使用环境变量,禁止写入代码库
  • 生产环境需运行 collectstatic,DEBUG 模式与生产模式静态文件处理不同
  • 区分 STATIC_ROOT(收集目标)与 STATICFILES_DIRS(源目录)

6. CSRF 安全

  • 表单需包含 {% csrf_token %},POST 请求否则会 403
  • AJAX 请求需设置 X-CSRFToken 头,从 cookie 获取令牌
  • @csrf_exempt 存在安全风险,仅用于带独立认证的 Webhook

7. 测试策略

  • TestCase 使用事务回滚,更快但无法测试事务行为
  • TransactionTestCase 真实提交,更慢但适用于事务测试
  • Client 测试完整请求流程,RequestFactory 直接测试视图/中间件
  • override_settings 装饰器可临时修改配置进行测试

8. 常见编码错误

  • get() 可能抛出 DoesNotExistMultipleObjectsReturned,安全写法用 filter().first()
  • auto_now 无法手动覆盖,如需手动设置改用 default=timezone.now
  • 循环导入问题:使用字符串引用如 ForeignKey('app.Model')
  • related_name 冲突时设为唯一值,或用 related_name='+' 禁用

显著优点

  • 覆盖 Django 开发全生命周期,从查询优化到部署配置
  • 提供具体代码示例和替代方案,即查即用
  • 强调性能陷阱(N+1、重复查询)和安全风险(CSRF、密钥泄露)

潜在局限

  • 假设用户已有 Django 基础,新手需配合官方文档理解
  • 未涵盖 Django REST framework、Channels 等扩展框架
  • 部分优化建议(如 Prefetch)需要 Django 2.0+ 版本

适合人群

  • 初级至中级 Django 开发者,希望规避常见错误
  • 团队技术负责人制定代码规范时参考
  • 面试准备者系统复习 Django 核心机制

常规风险

  • 性能优化建议基于常见场景,极端大数据量需配合数据库调优
  • 迁移操作具有破坏性,生产环境执行前务必备份
  • @csrf_exempt 等禁用安全措施的操作需充分评估替代方案

Django 内容

手动下载zip · 1.8 kB
SKILL.mdtext/markdown
请选择文件