django REST框架- Django-ninja

蟲師發表於2022-03-31

Django 是我學習的最早的web框架,大概在2014年,當時選他原因也很簡單就是網上資料比較豐富,自然是遇到問題更容易找答案,直到 2018年真正開始拿django做專案,才對他有了更全面的瞭解。他是一個入門有門檻,學會了做專案非常方便的Web框架。

《2020 Python 開發者調查結果》
https://www.jetbrains.com/zh-cn/lp/python-developers-survey-2020/

從上圖中可以看出django仍然被很多開發者使用。極客時間去年也有出過《Django 快速開發實戰》的課程。雖然,我網上看到挺多開發吐槽django,學習成本高,效能差。直到現在,當我要看開始一個正式專案的時候,仍然會考慮Django。

優點

  1. 通過腳手架建立專案/應用:不用考慮專案架構怎麼設計。
  2. 自帶Admin後臺:在沒有前端的情況下,可以比較方便通過Admin對資料進行操作。
  3. 自帶常用模組:一個命令就能生成 group、user、session ...表,一般個系統都需要user表吧!你還在考慮user表設計,我已經把登入/註冊功能寫完了。
  4. 自帶ORM:對於建表和運算元據庫可太方便了。
  5. 自帶單元測試模組:雖然不是必用,但寫單元測試很方便的,尤其是執行測試資料隔離,不依賴資料庫去構造測試資料。

缺點

  1. 模板語言:在前後端分離的架構下,不用Django做頁面了,這個東西可以拋棄了。
  2. Form 元件:以後端的方式渲染頁面上的表單, 這個東西也可以拋棄了。
  3. 只有get/post方法:這就很不符合 RESTful 風格了。
  4. 沒有引數校驗:這就會導致開發介面效率不高,要寫不少程式碼來判斷是否為空,型別對不對。
  5. 效能差:反正各種效能對比中都是被吊打的那位。
  6. 非同步支援的不好:如果你很在意非同步,還是不要用django了。

以上算是我對django的淺薄的見解吧!現在的當紅web框架,那當然是fastapi了,我之前的文章也有做介紹。django的大部分缺點,剛好是fastapi的優勢,有沒有二者相結合的產物?

django-ninja: https://django-ninja.rest-framework.com/

Django Ninja is a web framework for building APIs with Django and Python 3.6+ type hints.

django-ninja不像django-rest-framework學習成本那麼高,有著和fastapi非常類似的用法。

django-ninja 體驗

  • 安裝
> pip install django
> pip install django-ninja
  • 建立專案
> django-admin startproject apidemo
  • 修改urls.py
from django.contrib import admin
from django.urls import path
from ninja import NinjaAPI

api = NinjaAPI()


@api.get("/add")
def add(request, a: int, b: int):
    return {"result": a + b}


urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", api.urls),
]
  • 啟動專案
> python manage.py runserver
  • 自動帶api文件

實現登入介面

當然,只是對比實現一個簡單的介面,django-ninja 確實沒有比fastapi簡單。我們就做一個實際的功能,實現使用者登入介面。

一般框架實現過程:

  1. 需要準備一個資料庫。
  2. 建立一個庫和一張使用者表。
  3. 框架需要與資料庫連線。
  4. 通過介面實現使用者登入。

django-ninja 有django加持,會把這個過程變得極其簡單。

  1. 執行資料庫遷移
> python manage.py migrate

這一個命令相關表已經建好了,django預設使用sqlite3,不需要考慮資料庫連線。

  1. 建立一個管理員賬號
> python manage.py createsuperuser
Username (leave blank to use 'user'): admin  # 使用者名稱
Email address: admin@mail.com   # 郵箱
Password:                       # 密碼
Password (again):               # 確認密碼
Superuser created successfully.

我們需要一個可以登入成功的賬號。

  1. 實現登入介面

修改ursl.py檔案

from django.contrib import admin
from django.urls import path
from django.contrib import auth
from ninja import NinjaAPI
from ninja import Schema

api = NinjaAPI()


class LoginIn(Schema):
    # 登入引數型別校驗
    username: str
    password: str


@api.post("/login")
def user_login(request, payload: LoginIn):
    """
    使用者登入
    """
    user = auth.authenticate(username=payload.username, password=payload.password)
    if user is not None:
        return {"success": True, "msg": "login success"}
    else:
        return {"success": False, "msg": "login fail"}


urlpatterns = [
    path('admin/', admin.site.urls),
    path("api/", api.urls),
]

注意:這是個真實可用的登入介面,有引數型別校驗,有查詢資料庫校驗。只有傳入的是第2步建立的帳號才可以返回login success

總結

  1. fastapi的示例雖然非常簡單,真的拿來做專案仍需要補充額外一些東西,反觀django似乎更簡單。

  2. 本文應該適合有django使用經驗的同學,如果你沒有,這絕對不是一篇安利你學習django的文章。

  3. djano-ninja幾月前就注意到這個專案了,雖然,每週都在分享測試技術,但其實我的大部分工作是web前後端開發,所以,也會更關注這方面技術。

  4. flask也有類似的REST框架哦~!apiflask。

相關文章