Django REST framework 數據處理api


一、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"})),

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

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

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

①課程頁面,應該包含多條數據(需要分頁),所以是基於 Course 表做數據處理的;

②課程詳情頁面,就應該基於 CourseDetail 表展開操作,前端要什么數據就返回什么數據,而不是返回所有數據。

那么讓我們看看用 rest_framework 的序列化做了什么:

對於這條接口:

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

需要獲取的數據很簡單,如下:

從model中知道,level 字段存儲的是對應 level 的數字,但我們不應該給前端返回1、而是返回對應的 level 文字,所以對於 level 字段采用了 get_level_display。

對於這條接口:

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

如果需要返回的數據很多,那么對應的邏輯也就相對復雜一點,具體如下:

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

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

 三、登錄接口

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

在model中新增兩張表:

這里登錄視圖繼承APIView實現,當然也可以選擇其他的,邏輯如下:

四、需要身份認證的視圖

前端邏輯:如果這個頁面需要登錄才能訪問,則跳轉到登錄頁面,登錄成功,則會獲取到后端返回的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 渲染器可以使返回的數據在瀏覽器以更清晰的形式展示,一下就能看出數據整體結構,加快開發速度。實際生產環境記得去掉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM