一、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 渲染器可以使返回的數據在瀏覽器以更清晰的形式展示,一下就能看出數據整體結構,加快開發速度。實際生產環境記得去掉。