以防有其餘業務線的須要,致使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 表結構: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數據處理方式,基本須要什麼數據都能返回。
登陸成功,給用戶返回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 渲染器可使返回的數據在瀏覽器以更清晰的形式展現,一下就能看出數據總體結構,加快開發速度。實際生產環境記得去掉。