這幾個庫讓 Django Web 開發事半功倍

火眼君發表於2020-02-08

前言

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 Web 開發事半功倍

結合 Django 的 Model,開發一個 Restful API 只需要 3 步。

1.1 建立 Model 的序列化類 Serializer

Serializer 是序列化類,用於 Model 物件和 API Json 結構的相互轉換。最簡單的實現如下所示。

這幾個庫讓 Django Web 開發事半功倍

基本的 Model Field 都有對應的 Serializer Field 自動對映,無需額外編寫。同時還提供了一些特殊的 Field,如外來鍵 ID 轉換成其他欄位,甚至可以在序列化時將整個關聯物件引入。

1.2 建立檢視 View

檢視分為三類:方法檢視,類檢視,基於 Model 的 ViewSet。

a) 方法檢視

方法檢視就是一個方法,類似與 Django 的方法檢視,只是加個裝飾器就行了。

這幾個庫讓 Django Web 開發事半功倍

方法 api_view 的引數可以限定 Http 方法,預設是 GET,最後返回 Response 物件即可。

b) 類檢視

類檢視就是將 Http 方法對映到類的方法上。

這幾個庫讓 Django Web 開發事半功倍

c) ViewSet 檢視

ViewSet 檢視更簡單,直接可以繫結 Model 和檢視。

這幾個庫讓 Django Web 開發事半功倍

1.3 繫結路由

最後繫結路由就可以訪問了。

這幾個庫讓 Django Web 開發事半功倍

可以用 Django 的 path 繫結或者用 router 物件。

還有其他的認證、鑑權、限速等強大功能,內容太多,這裡就不展開了。

django-filter

這個庫給 Django API 提供了篩選功能,配合 Rest Framework 使用,可以一行程式碼提供模型的強大篩選 API。

pip install django-filter
複製程式碼

這幾個庫讓 Django Web 開發事半功倍

然後可以通過 URL 引數進行篩選。

http://example.com/api/users/1/?name=huoyan&age=20
複製程式碼

Django CORS Headers

對於前後端分離的架構,後端 API 需要新增 CORS 相應頭以提供跨域訪問功能。可以自行在相應的每個 Header 中新增,當然現成的輪子有了,何樂而不為?

pip install django-cors-headers
複製程式碼

使用非常簡單,只要新增 installed_appmiddlewares 就可以了。

這幾個庫讓 Django Web 開發事半功倍

同時提供了自定義的配置功能,可直接在 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,日誌等等,非常實用,開發除錯必用。

這幾個庫讓 Django Web 開發事半功倍

pip install django-debug-toolbar
複製程式碼

使用也非常簡單。

需要配置 installed_app,靜態資源路徑和 Middlewares

這幾個庫讓 Django Web 開發事半功倍

最後新增路由,判斷 Debug 為 True 時啟用。

這幾個庫讓 Django Web 開發事半功倍

然後我們訪問 API 或者檢視時會在側邊增加一個除錯欄。

這幾個庫讓 Django Web 開發事半功倍

Django Environ

對於線上服務來說,多環境不同配置是必不可少的,這就需要 Django Environ 來出馬了。Django Environ 可方便地將環境變數合併到 Django settings 配置中。

pip install django-environ
複製程式碼

我們一般在 setting.py 中這麼寫

這幾個庫讓 Django Web 開發事半功倍

然後在需要動態配置的設定上獲取值。

這幾個庫讓 Django Web 開發事半功倍

我們可以通過環境變數或者環境變數檔案(唯一直接讀取環境變數 ENV_FILE)來載入配置。

.env 檔案類似這樣(on/off 會被自動轉換為布林值)

DEBUG=on
CORS=on
LOG_LEVEL=INFO
LOG_FILE=app.log
複製程式碼

同時可以直接轉換資料庫和快取等配置為一個環境變數。

settings.py 中這樣配置

這幾個庫讓 Django Web 開發事半功倍

然後環境變數或 .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 Web 開發事半功倍

結合上面的 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 的鑑權配置

這幾個庫讓 Django Web 開發事半功倍

然後新增 Token 的獲取和重新整理 API

這幾個庫讓 Django Web 開發事半功倍

使用如下請求就能獲取 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 管理介面的皮膚,提供了更友好的使用體驗。

這幾個庫讓 Django Web 開發事半功倍

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
複製程式碼

簡單配置

這幾個庫讓 Django Web 開發事半功倍

執行資料庫建立

python manage.py migrate django_celery_results
複製程式碼

django-celery-beat 是將 Celery 的定時任務配置轉移到 Django 的資料庫中儲存,如果我們業務的管理後臺需要定製定時任務,非常好用。

pip install django-celery-beat
複製程式碼

簡單配置

這幾個庫讓 Django Web 開發事半功倍

執行資料庫建立

python manage.py migrate
複製程式碼

最後在啟動 Celery Beat 的時候指定 scheduler

celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
複製程式碼

後記

今天先寫這麼多了,這些都是這幾年 Django 開發積累下來的精選庫,如果大家使用中有任何疑問,歡迎評論,找我討論。如果個別庫使用人數多的話,可以再寫篇詳細使用及避坑指南。如果覺得有用,千萬不要吝惜點贊收藏哦!

我是火眼君,願我的寫作,驅散心靈的孤單。

參考

相關文章