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

前言

Django 是 Python 語言開發的 Web 框架,因其功能強大,開發快速而廣受歡迎。在 Github 上更是收穫了 47K+ 的 Star,其社區和周邊庫也極其活躍,下面我就來分享一些我工做中常用的庫,用好了事半功倍,大大增長開發效率,3 小時幹一天的活,剩下時間能夠好好划水(學習)!html

除了列舉,我還會結合實際使用狀況做使用演示,方便你們根據須要篩選。如下內容較長,建議先收藏再看。前端

本文全部庫均在 Django 2.1 以上實測過,部分庫在 Django 1.11 以上均可以使用。python

正文

Django Rest Framework

Django Rest Framework 是我最最推薦的,也是我開發 Django 服務的必用庫。也許它的知名度已經足夠大,不須要我展開介紹了,我就簡單介紹下它的使用(詳細的也不夠寫😂)ios

Django Rest Framework 給 Django 提供了一套 Restful 規範的 API,並提供了配套的一系列功能,如認證、鑑權、限速等,同時還提供了 UI 的測試界面。git

pip install djangorestframework
複製代碼

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

1.1 建立 Model 的序列化類 Serializerredis

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

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

1.2 建立視圖 Viewdjango

視圖分爲三類:方法視圖,類視圖,基於 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_appmiddlewares 就能夠了。

同時提供了自定義的配置功能,可直接在 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 開發積累下來的精選庫,若是你們使用中有任何疑問,歡迎評論,找我討論。若是個別庫使用人數多的話,能夠再寫篇詳細使用及避坑指南。若是以爲有用,千萬不要吝惜點贊收藏哦!

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

參考

相關文章
相關標籤/搜索