前言
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 開發積累下來的精選庫,如果大家使用中有任何疑問,歡迎評論,找我討論。如果個別庫使用人數多的話,可以再寫篇詳細使用及避坑指南。如果覺得有用,千萬不要吝惜點贊收藏哦!
來自知乎專欄。