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。