Django 是我學習的最早的web框架,大概在2014年,當時選他原因也很簡單就是網上資料比較豐富,自然是遇到問題更容易找答案,直到 2018年真正開始拿django做項目,才對他有了更全面的了解。他是一個入門有門檻,學會了做項目非常方便的Web框架。
《2020 Python 開發者調查結果》
 https://www.jetbrains.com/zh-cn/lp/python-developers-survey-2020/

從上圖中可以看出django仍然被很多開發者使用。極客時間去年也有出過《Django 快速開發實戰》的課程。雖然,我網上看到挺多開發吐槽django,學習成本高,性能差。直到現在,當我要看開始一個正式項目的時候,仍然會考慮Django。
優點
通過腳手架創建項目/應用:不用考慮項目架構怎么設計。自帶Admin后台:在沒有前端的情況下,可以比較方便通過Admin對數據進行操作。自帶常用模塊:一個命令就能生成 group、user、session ...表,一般個系統都需要user表吧!你還在考慮user表設計,我已經把登錄/注冊功能寫完了。自帶ORM:對於建表和操作數據庫可太方便了。自帶單元測試模塊:雖然不是必用,但寫單元測試很方便的,尤其是運行測試數據隔離,不依賴數據庫去構造測試數據。
缺點
模板語言:在前后端分離的架構下,不用Django做頁面了,這個東西可以拋棄了。Form 組件:以后端的方式渲染頁面上的表單, 這個東西也可以拋棄了。只有get/post方法:這就很不符合 RESTful 風格了。沒有參數校驗:這就會導致開發接口效率不高,要寫不少代碼來判斷是否為空,類型對不對。性能差:反正各種性能對比中都是被吊打的那位。異步支持的不好:如果你很在意異步,還是不要用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簡單。我們就做一個實際的功能,實現用戶登錄接口。
一般框架實現過程:
- 需要准備一個數據庫。
 - 創建一個庫和一張用戶表。
 - 框架需要與數據庫連接。
 - 通過接口實現用戶登錄。
 
django-ninja 有django加持,會把這個過程變得極其簡單。
- 執行數據庫遷移
 
> python manage.py migrate
 
        這一個命令相關表已經建好了,django默認使用sqlite3,不需要考慮數據庫連接。
- 創建一個管理員賬號
 
> python manage.py createsuperuser
Username (leave blank to use 'user'): admin  # 用戶名
Email address: admin@mail.com   # 郵箱
Password:                       # 密碼
Password (again):               # 確認密碼
Superuser created successfully.
 
         
         
        我們需要一個可以登錄成功的賬號。
- 實現登錄接口
 
修改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。
總結
-  
fastapi的示例雖然非常簡單,真的拿來做項目仍需要補充額外一些東西,反觀django似乎更簡單。
 -  
本文應該適合有django使用經驗的同學,如果你沒有,這絕對不是一篇安利你學習django的文章。
 -  
djano-ninja幾月前就注意到這個項目了,雖然,每周都在分享測試技術,但其實我的大部分工作是web前后端開發,所以,也會更關注這方面技術。
 -  
flask也有類似的REST框架哦~!apiflask。
 
