目录
1. Django 请求生命周期
1.1 完整流程(标准面试回答)
用户请求 → Nginx → WSGI 协议 → Django 中间件 → 路由匹配 → 视图函数 → 逻辑处理 → ORM 数据库操作 → 模板/JSON 响应 → 依次返回中间件 → 最终返回给用户
1.2 详细拆解
- WSGI:网关接口,连接 Nginx 与 Django,负责协议转换
- 中间件:全局拦截请求/响应,做权限、日志、跨域、限流
- 路由系统:URL 匹配对应的视图
- 视图:业务逻辑入口
- ORM:数据库交互
- 响应:渲染页面或返回 JSON
1.3 面试必问扩展
- 中间件执行顺序:请求自上而下,响应自下而上
- 异常捕获:中间件、视图装饰器、handler500 全局捕获
- 全局处理:跨域、请求日志、用户认证、接口限流
- 生命周期是 Django 架构核心,所有扩展功能都基于此
2. Django ORM 查询性能优化
2.1 select_related
- 作用:一对一、外键关联查询
- 原理:SQL JOIN 联表查询,减少查询次数
- 适用:外键正向查询
- 示例:
Article.objects.select_related('author').all()
2.2 prefetch_related
- 作用:多对多、反向查询
- 原理:子查询,再在内存中关联
- 适用:多对多、反向外键
- 示例:
User.objects.prefetch_related('articles').all()
2.3 only / defer
- only:只查询指定字段,减少数据传输
- defer:排除不需要的字段
- 作用:大幅提升大数据集查询速度
- 禁忌:查询后不要访问未取字段,否则触发 N+1
2.4 values / values_list
- values:返回字典列表
- values_list:返回元组列表
- 优势:不生成模型对象,速度极快,适合纯数据展示
2.5 禁止循环里查库(N+1 问题)
- 循环中每次都查库,性能灾难
- 解决:提前用 select_related / prefetch_related 一次性查出
2.6 索引优化
- 经常查询的字段必须加索引(db_index=True)
- 唯一字段加 unique
- 联合查询建立联合索引
2.7 iterator 大数据分页
- 大数据量(万级以上)用 iterator() 分批次加载
- 避免一次性加载全部数据导致内存爆掉
2.8 面试必背扩展
- 批量操作:bulk_create、bulk_update
- 避免使用 get() 捕获异常,改用 filter().first()
- 尽量使用原生 QuerySet,少转 list
- explain() 查看执行 SQL 语句
3. Django 缓存机制
3.1 缓存级别(4 种)
- 全站缓存:整个网站全部缓存(少用)
- 视图缓存:缓存整个视图返回(@cache_page)
- 片段缓存:模板中某一块缓存(% load cache %)
- 手动缓存:代码里自己 set/get(最常用、最灵活)
3.2 缓存存储引擎
- Redis:企业首选,支持过期、分布式
- Memcached:纯内存,高性能
- 本地内存:开发用
- 文件系统:不推荐
3.3 缓存使用规范
- 缓存热点数据、不常变数据
- 设置合理过期时间
- 数据更新时主动删除缓存,保证一致性
- 避免缓存过大、无限增长
3.4 面试高频问题
- 缓存穿透、击穿、雪崩(同 Redis 知识点)
- 缓存更新策略:先更库再删缓存
- 缓存与数据库一致性如何保证
4. Django 事务管理
4.1 atomic 原子性
- 装饰器:
@transaction.atomic - 上下文:
with transaction.atomic() - 作用:要么全部成功,要么全部失败,保证数据安全
4.2 保存点与回滚
- 可设置 savepoint 部分回滚
- 异常触发自动回滚
4.3 必须加事务的场景
- 支付
- 订单创建/取消
- 报告生成
- 库存扣减
- 批量数据修改
4.4 面试扩展
- 事务隔离级别:读已提交、可重复读
- 长事务风险:锁等待、数据库压力大
- 事务与锁结合,解决并发超卖问题
5. Django 信号机制
5.1 什么是信号
模型状态变更时自动触发的钩子(pre_save、post_save、pre_delete、post_delete 等)
5.2 典型使用场景
- 数据变更日志记录
- 操作审计
- 数据同步
- 关联数据自动更新
- 消息通知触发
5.3 注意事项(面试必说)
- 不要写复杂逻辑、慢逻辑
- 避免循环触发信号
- 不要在信号里做阻塞操作
- 批量操作不会触发信号
6. Django 高频面试扩展知识点
6.1 Django 中间件
- 全局请求/响应拦截
- 认证、权限、日志、限流、跨域
- 可以中断请求直接返回
6.2 中间件执行顺序
- 请求:从上到下
- 响应:从下到上
- 异常:被上层中间件捕获
6.3 Django 版本区别
- Django 2.x:支持 Python 3+
- Django 3.x:支持异步
- Django 4.x:安全加强、弃用旧功能
6.4 前后端分离最佳实践
- 只做 API,不渲染模板
- 配合 DRF 使用
- JWT 认证
- 统一返回格式、全局异常
6.5 Django 安全机制
- CSRF 防护
- XSS 防护
- SQL 注入防护(ORM 自带)
- 权限控制
- 接口限流
评论区