Let's Django!Let's Django!

這是 Django Tutorial 的第 5 篇。

範例程式碼可參考我的 GitHub 專案,更多教學請見「Django 文章總覽」。


終於要進入 Django API 的世界了!

不過,在開始 DRF 教學之前,我要先介紹 Django、DRF 兩者間的關係

為什麼 Django 不乾脆自己實作 API 功能就好?而是把這個任務交給第三方套件,比如本文的 Django REST framework。

本文主旨

因此,本文的主要目標是:為讀者建立一個「high level」的世界觀。讓你了解為何在 Django 之外,我們還需要 Django REST framework。

了解兩者的關係,更能體會它們所扮演的不同角色。

簡言之,這一篇還沒有要開始寫 API。

系列:Django REST framework 教學


Django 介紹

Django 是一個全端框架(或說是附有前端元件後端框架),它強大而靈活,能處理從模板渲染、表單生成、後台管理、資料庫模型等,幾乎所有事情。

我們常說 Python 是「Batteries Included」(意味有豐富的標準函式庫),而 Django 也是如此——它大而全。

在這個設計理念下,Django 關心的是「整個網站的建構」,所以它必須要從前端包到後端,而不會只專注在後端 API。

Django REST framework 介紹

當涉及到現代 Web 開發,尤其是與前端框架如 React、Vue 的配合,我們需要更專注於 API 的開發方式。畢竟「前後端分離」是當前 Web 開發主流。

於是我們有了 Django REST framework

我仔細看,f 真的是小寫,而 REST 要全大寫,這是官方的寫法。為了表述方便,以下簡稱為 DRF。

DRF 引入了專門針對 API 的功能,如強大的序列化器、權限管理、通用 API 視圖。

這些功能使得 DRF 不僅能夠擴充 Django 的原有能力,而且提供了對 RESTful API 開發的專門支持。

不得不承認,在「前後端分離」已成顯學的今日,有了 DRF 這樣的框架,能有效維持 Django 作為一個開源後端框架的整體競爭力


為何需要 DRF

但又話說回來,為何 Django 不自己強化 API 功能,而是交給 DRF 這類套件呢?

我們可以從以下兩個方向考慮:

一、專注與專業分工

  • Django 的核心團隊專注於框架的基礎功能——比如 ORM、Middleware,這些是所有使用 Django 的開發者都需要的核心功能。
  • API 開發則是一個專業領域,涉及不同的需求和專業知識,如資料驗證與序列化。DRF 對建構 REST API 功能進行擴充,提供了一整套工具與實踐。

二、模組化與彈性

  • 通過將 API 功能外包給如 DRF 這樣的套件,Django 保持了核心的簡潔,同時提供了一定彈性。讓開發者可以根據需求,選擇合適自己的工具。
  • 換句話說,Django 專注在核心功能而不是 API,可以讓它更全面、更靈活。
  • 這意味著你可以只在需要時引入 DRF,進而保持專案的輕量。畢竟,Django 本身已經非常豐富。

Django 與 DRF 比較

綜上所述,我們直接用表格來比較兩者的功能與角色差異:

Django DRF
主要目的 全面的 Web 框架,提供完整的 Web 應用開發支持。 專注於 Web API 的建立,特別是 RESTful API。
設計哲學 提供高度可重用性和快速開發元件,比如 Django ORM。 API 優先:提供 API 特定的工具和功能,比如序列化器。
核心功能 模板渲染、表單生成、管理界面、資料庫模型。 序列化、權限控制、API View。
目標用戶 面向所有類型的 Web 開發者,包括初學者和專業人士。 面向需要建立複雜 API 的開發者。

了解 Django 與 DRF 的差異後,還有一個議題也很重要——CBV 與 FBV。

CBV vs FBV

Class-based view 與 function-based view,兩者都是實現 Django 中 view 的手段,各有適合的場景。

CBV 有著重用程式碼優勢,適合大型專案。而 FBV 則以簡單、直接為賣點,方便快速開發中小型專案。

老實說,我只寫過 FBV,而且我也更愛 FBV。

DRF 更擅長 CBV

不過,DRF 本身對於 CBV 有著「更完整的支援」。

所以如果你想要將 DRF 發揮到極致,那它提供的 GenericAPIView 值得了解一下。並且和 DRF 其它元件有著高度整合。

本系列只會使用 FBV

不過因為我沒真正大量使用過 CBV,而且 DRF 系列只是入門教學,所以我只會用 FBV 進行示範。

另一方面,Django Ninja、FastAPI、Flask 都是以 FBV 為主,或許對大部分人而言,能善用 FBV 已然足夠。


DRF vs Django Ninja

長期以來,DRF 一直是開發 Django API 的主要甚至唯一選擇——直到 Django Ninja 的出現。

Django Ninja 是烏克蘭開發者 Vitaliy Kucheryaviy 的力作,可以想成是「Django 版 FastAPI」。

它提供不同於傳統寫法的 FBV,高度整合了 Python type hints。並使用 Pydantic 進行資料的驗證與序列化,還有最重要的——自動產生 API 文件。

關於 Django Ninja,以及它和 DRF 的比較,我會放到 Django Ninja 系列,再行介紹。


小結:入門者的選擇

本文講述了 Django 與 DRF 在現代開發中扮演的角色,與它們之間相輔相成的關係。

如果你是剛開始接觸 Django API 的開發者,我相信 DRF 仍是第一選擇。因為它更加成熟,而且累積了大量的歷史資料,可作為開發時的參考。

在熟悉了基本的 Django API 開發流程與常見元素後,再學習 Django Ninja 也不遲。