Django REST framework 數據處理api

1、url分發

以防有其餘業務線的須要,致使url雜亂,將每一個app用到的url都設置在本身的應用中。前端

# 項目下的url 
url(r"^api/(?P<version>\w+)/", include("api.urls")),
# 應用下的url
url(r"^login/$", account.LoginView.as_view()),
url(r"^courses/$", course.CourseViewSet.as_view({"get": "list"})),
url(r"^course/(?P<pk>\d+)/$", course.CourseViewSet.as_view({"get": "retrieve"})),

2、獲取多條數據和詳細數據

先來看一下示例用到的 model 表結構:vue

從上面的url可知道,這兩條接口能夠用同一個CBV處理數據:後端

①課程頁面,應該包含多條數據(須要分頁),因此是基於 Course 表作數據處理的;api

②課程詳情頁面,就應該基於 CourseDetail 表展開操做,前端要什麼數據就返回什麼數據,而不是返回全部數據。瀏覽器

那麼讓咱們看看用 rest_framework 的序列化作了什麼:cookie

對於這條接口:app

http://127.0.0.1:8000/api/v1/courses/

須要獲取的數據很簡單,以下:測試

從model中知道,level 字段存儲的是對應 level 的數字,但咱們不該該給前端返回一、而是返回對應的 level 文字,因此對於 level 字段採用了 get_level_display。url

對於這條接口:spa

http://127.0.0.1:8000/api/v1/course/1/

若是須要返回的數據不少,那麼對應的邏輯也就相對複雜一點,具體以下:

那麼讓咱們看一下這條API返回的數據吧(測試數據提早錄入好了~):

只要熟悉了這兩條API數據處理方式,基本須要什麼數據都能返回。

 3、登陸接口

登陸成功,給用戶返回token。

在model中新增兩張表:

這裏登陸視圖繼承APIView實現,固然也能夠選擇其餘的,邏輯以下:

4、須要身份認證的視圖

前端邏輯:若是這個頁面須要登陸才能訪問,則跳轉到登陸頁面,登陸成功,則會獲取到後端返回的token,好比vue中使用vue-cookies保存登陸成功的用戶信息(包括token),而後再攜帶token訪問這個頁面的接口;

後端邏輯:給這個視圖加上身份認證便可,這個認證就能夠基於token來作。

給這個視圖加上認證便可,哪一個視圖須要認證就在哪裏加,不建議全局配置。

若是在settings.py中配置了:

REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": None,   # 匿名用戶,request.user = None
    "UNAUTHENTICATED_TOKEN": None,  # 匿名用戶,request.auth = None
}

在視圖中,對於沒有登陸的用戶(匿名用戶),request.user 爲 None,若是沒設置,則顯示 AnonymousUser,建議配置,簡潔、更好區分。

綜上,結合API要體現接口、體現版本,最好返回JSON格式數據,因此個人 REST_FRAMEWORK 暫時配置以下:

REST_FRAMEWORK = {
    "DEFAULT_RENDERER_CLASSES": [
        "rest_framework.renderers.JSONRenderer",
        # "rest_framework.renderers.BrowsableAPIRenderer",
    ],
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
    "VERSION_PARAM": "version",  # 參數
    "DEFAULT_VERSION": "v1",  # 默認的版本
    "ALLOWED_VERSIONS": ["v1", "v2"],  # 容許的版本
    "UNAUTHENTICATED_USER": None,
    "UNAUTHENTICATED_TOKEN": None,
}

在開發階段 BrowsableAPIRenderer 渲染器可使返回的數據在瀏覽器以更清晰的形式展現,一下就能看出數據總體結構,加快開發速度。實際生產環境記得去掉。

相關文章
相關標籤/搜索