从零开始重新学习 Django:从 HTTP 开始的学习路线图

年终时,回顾过去一年总是自然而然的。对我来说,每年都会浮现一个主题——“我真的学会了 Django 吗?”

我已经使用 Django 和 Django REST Framework(DRF)多年,经历了大小项目。现在我可以自信地说:

“我已经能清晰地把握各个组件的工作原理,比以前更有感觉。”

当然,仍有许多未知之处。但至少我能对过去的自己,也能对刚起步的开发者说:“按这个顺序学习,路会更顺畅。”

本文正是在这种背景下写成的,旨在为想从零开始重新学习 Django 的人提供个人化的指导。它既像年终回顾,也希望成为任何时候都适用的 Django 学习基准


1. Django 最终是一个 HTTP 框架



这听起来很显而易见,但刚接触 Django 时往往会忽略这一点。

无论是渲染 UI,还是仅返回 JSON API,核心都是 接收 HTTP 请求并返回 HTTP 响应

  • 客户端(浏览器、App、其他服务器)发送 HTTP 请求。
  • Django 接收请求并进行相应处理。
  • 最后返回 HTTP 响应(HTML、JSON、文件、错误等)。

我们常提到的 Django 组件:

  • URLConf
  • View(FBV/CBV)
  • Template
  • ORM
  • Middleware
  • Authentication / Permission
  • DRF 的 Serializer、ViewSet、Router…

所有这些,实质上都是 “如何正确接收、处理并返回 HTTP 请求” 的工具。

如果忽视了这一视角,框架很快会变成 “魔法盒子”

“只要按这种写法就行…但到底为什么会这样?”

如果这种状态持续下去,最终会被框架牵着走。


2. 先理解“为什么这么做”,再关注功能

刚学 Django 时,往往会被以下功能吸引:

  • 登录/注册、社交登录
  • 权限/授权
  • 缓存设置
  • 异步任务(Celery 等)
  • 各种中间件与配置

这些功能确实在后期需要,但如果 过早 深入,往往会出现:

“为什么要这么做?”

在无法回答这个问题的情况下堆砌代码,结果会出现:

  • 修复错误后仍有不舒服的感觉
  • 每次想改结构都被框架束缚
  • 直接复制粘贴 Google 搜索结果,进入 “先能用再改” 模式

所以给过去的自己,也给刚起步的开发者的第一句话是:

“先理解 Web 的工作原理和 HTTP 的流程,再去使用功能。”


3. 理解 HTTP 流程,让 Django 的外部也清晰可见



想要“透明”地使用 Django,必须先掌握 HTTP 协议的基本流程。

至少可以亲手操作以下内容:

  • 请求的结构:URL、方法(GET/POST/PUT/DELETE…)、Header、QueryString、Body
  • 响应的决定因素:状态码(200/400/404/500…)、Header、Body(JSON/HTML 等)
  • 浏览器缓存与服务器关注点

举个简单例子:在终端直接发送请求。

curl -X GET "http://localhost:8000/articles/1/" -H "Accept: application/json"

这条请求已经包含了 HTTP 的核心要素:

  • URL:/articles/1/
  • 方法:GET
  • Header:Accept: application/json
  • 期望返回 JSON

当你把这整个流程在脑中绘制出来后,Django 的外部也会随之显现:

  • 为什么 nginx 会把某些路径代理到 Django
  • gunicorn/uWSGI 等 WSGI 服务器的角色
  • Django 负责哪些,哪些交给了其他层

到此,Django 不再是“未知的魔法”,而是 “为处理 HTTP 请求而设计的结构”


4. 第一个项目保持简单,用 FBV 开始

image of dev who is developing web service with Django

在 Django 入门时,我最推荐的做法是:

第一个项目保持简单,使用 Function-Based View(FBV)。

尽量满足以下条件:

  • 认证/权限最小化
  • 管理页面或设置不复杂
  • 模型关系简单(如文章、评论)
  • 关注“工作流程”,而非“漂亮结构”

举例:用 FBV 实现一个简单的文章列表/详情。

# views.py
from django.http import JsonResponse
from .models import Article

def article_detail(request, pk):
    article = Article.objects.get(pk=pk)
    data = {
        "id": article.id,
        "title": article.title,
        "content": article.content,
    }
    return JsonResponse(data)

这一个视图就包含了 Django 的核心流程:

  1. 接收 request 对象。
  2. 用 ORM 根据 pk 查询数据。
  3. 构造 Python 字典。
  4. 将其包装成 HTTP 响应(JSON)。

逐行调试时,你会看到:

  • URLConf 如何映射到视图
  • request 对象包含哪些信息
  • ORM 生成的 SQL
  • 响应如何被序列化为 JSON

在此阶段熟练掌握 Django ORM,后续任何规模的项目都会受益匪浅。


5. 接下来快速切换到 CBV 与 DRF

当你已经用 FBV 体会到 HTTP–View–ORM–Response 的完整流程后,第二个项目可以毫不犹豫地使用 CBV 和 DRF。

这时,你会真正感受到 Django 的强大与 DRF 的便利。

CBV 与 DRF 的价值:

  • 减少重复模式,提供可复用结构
  • 统一项目整体的设计模式
  • 明确职责分离
  • 通过 URL/Serializer/ViewSet/Permission 的耦合实现可扩展设计

示例:将同一功能迁移到 DRF。

# views.py (DRF)
from rest_framework.viewsets import ReadOnlyModelViewSet
from .models import Article
from .serializers import ArticleSerializer

class ArticleViewSet(ReadOnlyModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

只需注册路由:

# urls.py
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet

router = DefaultRouter()
router.register(r'articles', ArticleViewSet, basename='article')

urlpatterns = router.urls

现在:

  • /articles/
  • /articles/{id}/

这两个端点会自动工作。

如果你已经理解了 FBV 的 HTTP 流程,CBV/DRF 的“魔法”其实只是把同样的流程抽象成类。

“原来在内部也在跑同样的 HTTP 请求/响应流程,只是被封装成了类。”

把 CBV/DRF 看作 “已知的 HTTP 处理流程的抽象工具”,比把它们当作“必须记住的语法”更容易吸收。


6. Django 学习顺序整理

给过去的自己,也给刚起步的开发者,我建议的学习顺序如下:

  1. Web 与 HTTP 基础 - 浏览器–服务器的请求/响应流程 - HTTP 方法、状态码、Header、Cookie、Session - 用 curl 或 Postman 发送请求
  2. Django 基础:用 FBV 循环一次 - URLConf–View–Template–ORM 的基本流程 - 完成一个无认证/权限的小项目 - 用 ORM 直接实现 CRUD
  3. 深入 Django ORM 与 Admin - 模型设计、关系(ManyToOne、ManyToMany)、查询优化 - 用 Admin 管理数据,熟悉模型结构
  4. 转向 CBV - 用 Generic View 重写 CRUD - 观察 Mixin、继承结构,感受“模式抽象”
  5. 用 DRF 做 API 项目 - Serializer、ViewSet、Router、Permission、Authentication - 把 FBV/CBV 的功能迁移到 DRF
  6. 再往后做“炫酷功能” - 认证/授权、节流、分页、过滤 - 缓存、异步任务、部署、扩容

关键是:每一步都能自我解释“为什么这么做”。不是“因为这样写”,而是“因为 HTTP 与 Web 的结构决定了这样做更自然”。


7. 结语:不要记住框架,记住 Web

最后,我想留给过去的自己和刚起步的开发者一句话:

不要记住框架,记住 Web 的工作原理。

Django 只是帮助你理解这一点的优秀工具。

只要保持这个视角,你就能:

  • 即使 Django 版本变更,也能快速适应
  • 轻松切换到 Flask、FastAPI、Node、Spring 等框架
  • 在新的架构或云环境中保持一致的思考方式

你可以随时问自己:

  • “这个系统是如何处理 HTTP 的?”
  • “谁负责什么?”
  • “抽象层到底隐藏了哪些请求/响应模式?”

有了这些标准,你就不会被任何框架束缚,能在任何环境中成为稳定的 Web 开发者。