理解 Django 的架构:超越文件结构

发布: (2026年2月17日 GMT+8 15:56)
7 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将按照要求将其翻译成简体中文并保留原有的格式。

为什么 Django 结构让初学者困惑

大多数初学者的 Django 使用方式是这样的:

“我创建了一个项目。我创建了一个应用。现在我把逻辑放到某个地方,它就能工作。”

产生困惑的原因在于:

  • 项目应用 的区别概念不清。
  • MTV(模型‑模板‑视图)只被表面化地介绍。
  • 业务逻辑该放在哪里没有讨论。
  • 请求生命周期始终不可见。
  • Django 的“魔法”掩盖了架构流程。

如果不了解整体架构,Django 会给人一种受控的混乱感。
一旦弄清楚架构,它就会变得可预测且强大。

Source:

项目 vs. 应用 — 最常被误解的概念

Django 项目

项目配置容器。它定义了:

  • 全局设置
  • 已安装的应用
  • 中间件
  • 根 URL 配置
  • ASGI/WSGI 入口点

包含业务逻辑。可以把项目看作运行时配置和环境的边界。

Django 应用

应用功能模块单元,代表一个 领域边界

❌ 错误的模块化思维

users_app/
orders_app/
payments_app/

✅ 更好的面向领域的思考

accounts/
billing/
analytics/
core/

每个应用应封装:

  • 模型
  • 视图
  • URL
  • 与该特定领域相关的业务逻辑

应用不仅仅是一个文件夹 —— 它是一个 内聚的领域模块

正确解读 MTV

Django 遵循 MTV 模式

  • Model
  • Template
  • View

这常常与 MVC 相比较,但两者并不完全相同。

概念映射

DjangoClassical MVC
ModelModel
TemplateView
ViewController

Model

表示数据结构和数据库交互。

  • 定义模式
  • 处理 ORM 逻辑
  • 封装数据行为

在适当的情况下,模型应包含领域规则。

View

尽管叫 View,Django 的 View 更像是 controller。它:

  • 接收请求
  • 协调逻辑
  • 与模型交互
  • 返回响应

不应

  • 包含大量业务逻辑
  • 执行大规模数据转换
  • 成为随意堆放代码的地方

Template

负责呈现。在基于 API 的系统(例如 Django REST Framework)中,模板通常被序列化器和 JSON 响应所取代。

Django 请求生命周期(实际发生的事情)

了解这一点至关重要。

  1. 客户端 发送 HTTP 请求。
  2. Web 服务器 将请求转发给 Django(通过 WSGI 或 ASGI)。
  3. 中间件 处理请求。
  4. URL 解析器 匹配路径。
  5. 执行相应的 视图
  6. 视图与 模型 / 服务 交互。
  7. 创建 响应 对象。
  8. 中间件处理响应。
  9. 将响应返回给客户端。

关键洞察: 每个请求都会经过可预测的管道。Django 并非魔法——它是结构化的编排。

模块化设计建议(如何像中级开发者一样思考)

随着项目规模的扩大,默认的 Django 结构会变得不足。

1. 避免臃肿的视图

不佳示例

def create_order(request):
    # validation
    # business logic
    # pricing calculation
    # email sending
    # inventory update

解决方案: 将业务逻辑迁移到专门的层,例如:

  • services.py
  • 领域模块
  • 专用逻辑层

视图应当 协调 工作,而不是实现业务规则。

2. 引入服务层

典型的应用布局:

billing/
    models.py
    views.py
    services.py   # 写操作
    selectors.py  # 读取/查询逻辑

这样可以保持逻辑的组织性和可测试性。

3. 按领域边界思考

  • ❌ 所有代码都放在一个巨大的 app 中
  • ❌ 过度碎片化的微型 app

✅ 良好实践

  • 明确的领域边界
  • 高内聚
  • 低耦合

实际结构模式

成熟的 Django 系统通常会演变为如下布局:

project/

├── config/
│   ├── settings/
│   │   ├── base.py
│   │   ├── dev.py
│   │   └── prod.py

├── apps/
│   ├── accounts/
│   ├── billing/
│   ├── analytics/

├── core/
│   ├── middleware.py
│   ├── permissions.py

└── manage.py

生产环境中的常见模式:

  • 按环境拆分 settings
  • 专用 apps/ 文件夹
  • 基础设施与领域逻辑的明确分离
  • 服务(services)和选择器(selectors)模式
  • 集中式配置

结构应支持可扩展性——而不是与之抗争。

开发者常犯的错误

  1. 将所有逻辑放在视图中

    • 导致代码难以测试、重复、耦合度高。
  2. 过度使用信号

    • 信号功能强大但隐式;它们隐藏逻辑,产生不可见的依赖,使调试更困难。请谨慎使用。
  3. 忽视请求生命周期

    • 不了解中间件或 URL 解析会导致调试痛苦。
  4. 把应用当作随意的容器

    • 应用应当代表业务域模块,而不是任意的文件分组。
  5. 过早进行过度工程化

    • 并非所有项目都需要复杂的服务层、深层文件结构或微服务。应从简单开始,按需演进。

最后思考

Django 并非天生令人困惑。
当我们以过程式而非架构式的方式学习它时,它才会变得令人困惑。

如果你理解:

  • 项目与应用的边界
  • MTV(模型‑模板‑视图)的概念
  • 请求生命周期
  • 模块化结构原则

那么 Django 就不再是“魔法”。
它会成为一个可预测、可扩展的后端框架。

这就是使用 Django 与真正理解 Django 之间的差别。

0 浏览
Back to Blog

相关文章

阅读更多 »

Python 中的实例变量和实例方法

Python 中的实例变量与实例方法 在面向对象编程(Object‑Oriented Programming,OOP)中,你必须掌握的两个概念是: - 实例变量 - 实例方法