前言
Django 是 Python 語言開發的 Web 框架,因其功能強大,開發快速而廣受歡迎。在 Github 上更是收穫了 47K+ 的 Star,其社群和周邊庫也極其活躍,下面我就來分享一些我工作中經常使用的庫,用好了事半功倍,大大增加開發效率,3 小時幹一天的活,剩下時間可以好好划水(學習)!
除了列舉,我還會結合實際使用情況作使用演示,方便大家根據需要篩選。以下內容較長,建議先收藏再看。
本文所有庫均在 Django 2.1 以上實測過,部分庫在 Django 1.11 以上都可以使用。
正文
Django Rest Framework
Django Rest Framework 是我最最推薦的,也是我開發 Django 服務的必用庫。也許它的知名度已經足夠大,不需要我展開介紹了,我就簡單介紹下它的使用(詳細的也不夠寫?)
Django Rest Framework 給 Django 提供了一套 Restful 規範的 API,並提供了配套的一系列功能,如認證、鑑權、限速等,同時還提供了 UI 的測試介面。
pip install djangorestframework
複製程式碼
結合 Django 的 Model,開發一個 Restful API 只需要 3 步。
1.1 建立 Model 的序列化類 Serializer
Serializer 是序列化類,用於 Model 物件和 API Json 結構的相互轉換。最簡單的實現如下所示。
基本的 Model Field 都有對應的 Serializer Field 自動對映,無需額外編寫。同時還提供了一些特殊的 Field,如外來鍵 ID 轉換成其他欄位,甚至可以在序列化時將整個關聯物件引入。
1.2 建立檢視 View
檢視分為三類:方法檢視,類檢視,基於 Model 的 ViewSet。
a) 方法檢視
方法檢視就是一個方法,類似與 Django 的方法檢視,只是加個裝飾器就行了。
方法 api_view 的引數可以限定 Http 方法,預設是 GET,最後返回 Response 物件即可。
b) 類檢視
類檢視就是將 Http 方法對映到類的方法上。
c) ViewSet 檢視
ViewSet 檢視更簡單,直接可以繫結 Model 和檢視。
1.3 繫結路由
最後繫結路由就可以訪問了。
可以用 Django 的 path 繫結或者用 router 物件。
還有其他的認證、鑑權、限速等強大功能,內容太多,這裡就不展開了。
django-filter
這個庫給 Django API 提供了篩選功能,配合 Rest Framework 使用,可以一行程式碼提供模型的強大篩選 API。
pip install django-filter
複製程式碼
然後可以通過 URL 引數進行篩選。
http://example.com/api/users/1/?name=huoyan&age=20
複製程式碼
Django CORS Headers
對於前後端分離的架構,後端 API 需要新增 CORS 相應頭以提供跨域訪問功能。可以自行在相應的每個 Header 中新增,當然現成的輪子有了,何樂而不為?
pip install django-cors-headers
複製程式碼
使用非常簡單,只要新增 installed_app
和 middlewares
就可以了。
同時提供了自定義的配置功能,可直接在 Django 的 settings 裡配置。
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)
複製程式碼
Django Debug Toolbar
Django Debug Toolbar 提供了一個測試用的強大除錯欄,可在瀏覽器中直接檢視相應的配置、Http Header,SQL,日誌等等,非常實用,開發除錯必用。
pip install django-debug-toolbar
複製程式碼
使用也非常簡單。
需要配置 installed_app
,靜態資源路徑和 Middlewares
。
最後新增路由,判斷 Debug 為 True 時啟用。
然後我們訪問 API 或者檢視時會在側邊增加一個除錯欄。
Django Environ
對於線上服務來說,多環境不同配置是必不可少的,這就需要 Django Environ 來出馬了。Django Environ 可方便地將環境變數合併到 Django settings 配置中。
pip install django-environ
複製程式碼
我們一般在 setting.py 中這麼寫
然後在需要動態配置的設定上獲取值。
我們可以通過環境變數或者環境變數檔案(唯一直接讀取環境變數 ENV_FILE)來載入配置。
.env 檔案類似這樣(on/off 會被自動轉換為布林值)
DEBUG=on
CORS=on
LOG_LEVEL=INFO
LOG_FILE=app.log
複製程式碼
同時可以直接轉換資料庫和快取等配置為一個環境變數。
settings.py
中這樣配置
然後環境變數或 .env 檔案中這樣寫
DATABASE_URL=psql://postgres:123456@127.0.0.1:5432/postgres
CACHE_URL=rediscache://127.0.0.1:6379/1
複製程式碼
這比直接用
os.environ.get
載入環境變數好在哪裡呢?
- 提供了環境變數檔案載入,如果是本地除錯,把所有變數寫入檔案當然是最方便的了。
- 提供了統一的寫環境變數初始值的地方(初始化的地方),同時可以指定變數資料型別。
- 支援資料型別轉換,因為環境變數值都是字串,變數型別轉換幫助我們方便地處理轉換問題。
- 支援多行環境變數。
- 資料庫、Redis 等支援一個 URL 環境變數值,不需要一堆環境變數了。
- 支援環境變數引用。
Django-Redis
Django 中使用快取很常見,又簡單又好用的就是 redis 了。Django redis 庫可以直接配置 redis 作為 Django 的快取或 Session 後端,非常簡單。
pip install django-redis
複製程式碼
settings.py 中配置
結合上面的 django-environ 就更簡單了,我一般都是結合使用,只需要一行配置程式碼,一個環境變數。
CACHES = {
'default': env.cache(),
}
複製程式碼
環境變數
CACHE_URL=rediscache://127.0.0.1:6379/1
複製程式碼
作為 Session 後端使用
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
複製程式碼
django-rest-framework-simplejwt
Django Rest Framework 預設的鑑權方式是基於 Django 的(例如 Session 或者 Token),如果需要 JWT 的方式,現成的輪子也有。
pip install djangorestframework-simplejwt
複製程式碼
修改 Rest Framekwork 的鑑權配置
然後新增 Token 的獲取和重新整理 API
使用如下請求就能獲取 token 了
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "admin"}' \
http://localhost:8000/api/token/
{
"access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU",
"refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"
}
複製程式碼
臨時 token 失效後這樣重新整理 token
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"}' \
http://localhost:8000/api/token/refresh/
{"access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNTY3LCJqdGkiOiJjNzE4ZTVkNjgzZWQ0NTQyYTU0NWJkM2VmMGI0ZGQ0ZSJ9.ekxRxgb9OKmHkfy-zs1Ro_xs1eMLXiR17dIDBVxeT-w"}
複製程式碼
在前後端分離的專案上,我們前端使用 axios 的攔截器自動重新整理,業務無需關心,程式碼非常簡潔。
Grappelli
Grappelli 是 Django admin 管理介面的皮膚,提供了更友好的使用體驗。
pip install django-grappelli
複製程式碼
使用也很簡單。
配置一下 installed_app
INSTALLED_APPS = (
'grappelli',
'django.contrib.admin',
)
複製程式碼
新增路由
urlpatterns = [
path('grappelli/', include('grappelli.urls')), # grappelli URLS
path('admin/', admin.site.urls), # admin site
]
複製程式碼
新增請求上下文處理器
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'django.template.context_processors.request',
...
],
},
},
]
複製程式碼
然後重新處理一下靜態檔案就好了。
python manage.py collectstatic
複製程式碼
django-celery-results/django-celery-beat
如果你的 Django 服務需要用到 Celery 來做非同步任務,那麼這兩個庫還不錯,所以寫在一起。
django-celery-results
是將 Django 的 ORM 用作 Celery 非同步任務的儲存結果,在需要將非同步任務的結果長期儲存及分析時,可以用它來儲存到 Django 配置的資料庫中。
pip install django-celery-results
複製程式碼
簡單配置
執行資料庫建立
python manage.py migrate django_celery_results
複製程式碼
而 django-celery-beat
是將 Celery 的定時任務配置轉移到 Django 的資料庫中儲存,如果我們業務的管理後臺需要定製定時任務,非常好用。
pip install django-celery-beat
複製程式碼
簡單配置
執行資料庫建立
python manage.py migrate
複製程式碼
最後在啟動 Celery Beat 的時候指定 scheduler
celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
複製程式碼
後記
今天先寫這麼多了,這些都是這幾年 Django 開發積累下來的精選庫,如果大家使用中有任何疑問,歡迎評論,找我討論。如果個別庫使用人數多的話,可以再寫篇詳細使用及避坑指南。如果覺得有用,千萬不要吝惜點贊收藏哦!
我是火眼君,願我的寫作,驅散心靈的孤單。