侧边栏壁纸
博主头像
ZOUXS的空间博主等级

人生苦短,我学python

  • 累计撰写 23 篇文章
  • 累计创建 24 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Django 深度知识点

zouxs
2026-05-22 / 0 评论 / 0 点赞 / 6 阅读 / 6537 字
温馨提示:
本文最后更新于 2026-05-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

目录

  1. Django 请求生命周期
  2. Django ORM 查询性能优化
  3. Django 缓存机制
  4. Django 事务管理
  5. Django 信号机制
  6. Django 高频面试扩展知识点

1. Django 请求生命周期

1.1 完整流程(标准面试回答)

用户请求 → Nginx → WSGI 协议 → Django 中间件 → 路由匹配 → 视图函数 → 逻辑处理 → ORM 数据库操作 → 模板/JSON 响应 → 依次返回中间件 → 最终返回给用户

1.2 详细拆解

  1. WSGI:网关接口,连接 Nginx 与 Django,负责协议转换
  2. 中间件:全局拦截请求/响应,做权限、日志、跨域、限流
  3. 路由系统:URL 匹配对应的视图
  4. 视图:业务逻辑入口
  5. ORM:数据库交互
  6. 响应:渲染页面或返回 JSON

1.3 面试必问扩展

  • 中间件执行顺序:请求自上而下,响应自下而上
  • 异常捕获:中间件、视图装饰器、handler500 全局捕获
  • 全局处理:跨域、请求日志、用户认证、接口限流
  • 生命周期是 Django 架构核心,所有扩展功能都基于此

2. Django ORM 查询性能优化

  • 作用:一对一、外键关联查询
  • 原理:SQL JOIN 联表查询,减少查询次数
  • 适用:外键正向查询
  • 示例:Article.objects.select_related('author').all()
  • 作用:多对多、反向查询
  • 原理:子查询,再在内存中关联
  • 适用:多对多、反向外键
  • 示例: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 种)

  1. 全站缓存:整个网站全部缓存(少用)
  2. 视图缓存:缓存整个视图返回(@cache_page)
  3. 片段缓存:模板中某一块缓存(% load cache %)
  4. 手动缓存:代码里自己 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 自带)
  • 权限控制
  • 接口限流

相关链接

0

评论区