從零開始重新學習 Django:以 HTTP 為起點的學習路線圖

每到年底,回顧過去一年總會不自覺地想起一個主題:「我真的學會了 Django 嗎?」

我已經使用 Django 與 Django REST Framework (DRF) 數年,經歷了大小專案。現在我可以說:

「我已經能夠把握它的運作方式,感覺比以前清晰多了。」

雖然仍有許多未知,但我已經能夠對過去的自己以及剛踏入 Django 的開發者說:「按這個順序學習,會少走許多弯路。」

本文正是在這樣的背景下撰寫,提供一份個人化的 Django 從零學習指南。閱讀時不妨把它當作一份年度回顧,也可隨時參考,成為你學習 Django 的基準點。


1. Django 最終是處理 HTTP 的框架



雖然這句話聽起來很顯而易見,但在學習初期往往會被忽略。

Django 的核心是:接收 HTTP 請求,並回傳 HTTP 響應,不論是渲染 UI、返回 JSON API,或是傳送檔案。

  • 客戶端(瀏覽器、App、其他伺服器)發送 HTTP 請求。
  • Django 接收並處理。
  • 最後回傳 HTTP 響應(HTML、JSON、檔案、錯誤訊息等)。

我們常提到的 Django 元件:

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

這些都是為了「順利處理 HTTP 請求」而設計的工具。若忽略這一觀點,框架很快就會被視為「魔法盒子」。

「只要照這樣寫就行…但為什麼會這樣運作?」

若長期保持這種狀態,最終會被框架牽著走。


2. 先理解「為什麼」再學「功能」

初學者往往會被以下功能吸引:

  • 登錄/註冊、社群登入
  • 權限/授權
  • 快取設定
  • 非同步任務(Celery 等)
  • 各種 Middleware 與設定

這些功能確實在後續需要,但若過早深入,會產生以下問題:

  • 修正錯誤時仍感到不安
  • 想改結構時被框架束縛
  • 直接貼上 Google 搜尋結果,進入「先做就好」模式

因此,對於過去的自己與剛起步的開發者,我想說:

先理解網頁運作原理與 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 查詢資料
  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 請求/回應流程,只是以更抽象的方式呈現。」

若遇到不明白的地方,別忘了可以深入 Django 內部源碼,觀察其結構。


6. Django 學習順序總結

對於過去的自己與剛起步的開發者,我建議的學習順序如下:

  1. 網頁與 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 與網頁結構需要這樣」。


7. 結語:不要只記住框架,理解網頁

最後,我想留給過去的自己與剛起步的開發者一句話:

不要只記住框架,理解網頁如何運作。

Django 只是幫助你理解的工具。只要保持這個觀點:

  • Django 版本更新
  • 遇到 Flask、FastAPI、Node、Spring 等
  • 接觸新架構或雲端環境

你都能以同樣的標準提問:

  • 「這個系統如何處理 HTTP?」
  • 「哪裡負責什麼?」
  • 「這個抽象究竟隱藏了哪些請求/回應模式?」

有了這個基準,你就不會被任何框架束縛,能在任何環境中成為穩定的網頁開發者。