2024 iThome 鐵人賽2024 iThome 鐵人賽

這是 Django Ninja 系列教學的第 3 篇。

選擇任何工具之前,我們通常會先了解它能解決的問題,以及是否符合與自己的需求

本文將介紹 Django Ninja 這個現代化的 API 框架,探討它的起源和主要特點,並重點比較它與 Django REST framework 之間的差異,讓你能夠更好地選擇適合的工具。


Django Ninja 起源

Django Ninja 的起源與 FastAPI 有著密切的關係。

Django Ninja 可以被視為「Django 版的 FastAPI」,它比原生 FastAPI 能夠更好地與 Django 整合。

Django Ninja 的官方文件中,作者 Vitaliy Kucheryaviy 解釋了為什麼建立這個框架。這源於他在 Django 專案中使用 FastAPI 時遇到的一些挑戰,特別是在整合方面。

因此,他決定自己建立一個更合適的工具,從而誕生了 Django Ninja。

可想而知,Django Ninja 深受 FastAPI 的啟發。事實上,它同時也借鑑了不少 Django REST framework 的優秀實踐——這是後發者的優勢

文件中引用了這麼一句話,這是個常見的疑問:

Django Ninja looks basically the same as FastAPI, so why not just use FastAPI?

答案就是:兩者的整合不完美,而 Django Ninja 提供了一個更加適合 Django 開發者的版本。


Django Ninja 特點

Django Ninja 的一些關鍵特性,使其成為 Django API 開發者的優秀選擇:

  • 自動產生 API 文件: 利用 Python 型別提示和 Pydantic,自動生成符合 OpenAPI 標準的 API 文件,大大減少了文件維護的工作量——這也是我當初選擇 Django Ninja 最大理由。
  • 請求驗證與資料序列化: 基於 Pydantic BaseModel,驗證請求資料和處理資料的序列化、反序列化,確保 API 的穩定和數據正確。
  • 簡潔且高效的 API 定義: Django Ninja 提供了一種簡單明瞭的方式來定義 API 路由和處理邏輯(view 函式),使開發者能夠快速上手。
  • 與 Django 無縫整合: 框架設計之初就考慮到了與 Django 的兼容性,它可以輕鬆整合到現有的 Django 專案中,充分使用 Django 的既有功能,比如 ORM。
  • 支援非同步:Django Ninja 支援非同步處理,讓 API 在面對大量請求時,仍能維持高效的回應速度與處理效能。

Django Ninja 的非同步效能優勢

了解 Django Ninja 的特點後,不得不再次強調它對非同步的支援,這是 Django Ninja 相較於傳統同步框架如 Django REST framework 一大效能優勢。

django-ninja.devdjango-ninja.dev

從上圖中可知,在相對高並行(concurrency=50)的網路請求情境下,Django Ninja 的處理能力明顯優於 Flask + Marshmallow 和 Django REST framework。

非同步的好處在只有 1 個 worker 時更加明顯,這對於節省資源提高效能都有著重要意義。


了解了 Django Ninja,我們來比較它和 Django REST Framework 的差異。

Django Ninja 與 Django REST framework 的主要區別

剛進入 Python 後端開發領域的讀者,可能未必熟悉 Django REST framework,可以參考我寫過的這篇〈Django REST framework 教學(一)前言篇〉介紹。

文中還說明了,為何 Django 需要像 Django REST framework 這樣的 API 框架

Django REST framework 和 Django Ninja,都是 Django 生態系中,用於快速建立 API 的強大工具,而且前者的歷史悠久得多。

但它們在設計理念、功能實現上存在顯著差異。對我而言,它們甚至可以說是完全不同的工具😎

下面三個部分,總結了我個人認為兩者的主要區別。

設計理念

  • Django REST framework:作為一個成熟且全面的框架,它提供了豐富的元件。適合需要高度定制和複雜功能的專案,並且擁有強大的社群支持。
  • Django Ninja:專注於簡潔和開發速度,利用現代 Python 特性(如型別提示)來簡化 API 開發過程。適合追求快速開發和高效性能的專案。

主要功能差異

  • 序列化
    • Django REST framework:使用自定義的序列化器,支持更多複雜的序列化需求。
    • Django Ninja:使用 Pydantic BaseModel,簡化了序列化過程,但可能不如 Django REST framework 靈活。
  • API 文件生成
    • Django REST framework:需要額外的套件才能透過程式碼自動產生 API 文件,但效果不如使用 Pydantic 的框架。
    • Django Ninja:自動生成符合 OpenAPI 標準的文件,過程更簡便且高效。
  • 性能:(同步 vs 非同步)
    • Django REST framework:在功能豐富的情況下,性能可能受到一定影響。不支援非同步。
    • Django Ninja:在請求驗證和處理方面通常表現更快,而且支援非同步。

社群支持與生態

  • Django REST framework:擁有成熟的社群和大量的外掛套件,由 encode 團隊開發維護。
  • Django Ninja:較新的框架,社群規模較小,網路上的資料少很多,且主要依賴作者一人開發、維護。

總結

Django Ninja 和 Django REST framework 有著各自的優勢

  • 如果你追求的是快速開發、高性能、以及更現代化的 Python 型別提示,Django Ninja 是理想選擇,尤其適合需要非同步的場景。
  • 如果你需要處理更複雜的認證、權限管理,並且需要高度自定義的 API 驗證和處理邏輯,那麼 Django REST framework 是一個穩定且強大的選擇。

透過本文的介紹,相信你對 Django Ninja 有了更加清晰的認識。

接下來的教學中,我們將深入探討 Django Ninja 的各個部分,幫助你更好地掌握這個現代化的 API 開發工具。

不過在此之前,我們還有一個重要的前置主題:範例專案與環境設定。這會是我們學習 Django Ninja 的第一步。