django REST框架- Django-ninja


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM