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

前言

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
image

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

1.1 創建 Model 的序列化類 Serializer

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

image

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

1.2 創建視圖 View

視圖分為三類:方法視圖,類視圖,基于 Model 的 ViewSet。

a) 方法視圖

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

image

方法 api_view 的參數可以限定 Http 方法,默認是 GET,最后返回 Response 對象即可。

b) 類視圖

類視圖就是將 Http 方法映射到類的方法上。

image

c) ViewSet 視圖

ViewSet 視圖更簡單,直接可以綁定 Model 和視圖。

image

1.3 綁定路由

最后綁定路由就可以訪問了。

image

可以用 Django 的 path 綁定或者用 router 對象。

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

django-filter

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

pip install django-filter
image

然后可以通過 URL 參數進行篩選。

http://example.com/api/users/1/?name=huoyan&age=20

Django CORS Headers

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

pip install django-cors-headers

使用非常簡單,只要添加 installed_appmiddlewares 就可以了。

image

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

image
pip install django-debug-toolbar

使用也非常簡單。

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

image

最后添加路由,判斷 Debug 為 True 時啟用。

image

然后我們訪問 API 或者視圖時會在側邊增加一個調試欄。

image

Django Environ

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

pip install django-environ

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

image

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

image

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

.env 文件類似這樣(on/off 會被自動轉換為布爾值)

DEBUG=on
CORS=on
LOG_LEVEL=INFO
LOG_FILE=app.log

同時可以直接轉換數據庫和緩存等配置為一個環境變量。

settings.py 中這樣配置

image

然后環境變量或 .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 中配置

image

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

image

然后添加 Token 的獲取和刷新 API

image

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

image
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

簡單配置

image

執行數據庫創建

python manage.py migrate django_celery_results

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

pip install django-celery-beat

簡單配置

image

執行數據庫創建

python manage.py migrate

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

celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler

后記

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

來自知乎專欄

參考

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。