在咱們瞭解的 MVC
模式和 MVT
模式中, 都有提到 View
視圖, 它是提供接口服務和邏輯的代碼, 例如在 Django 項目中常常會定義各類 class UserLoginViewSet(...)
或者是 def user_login(request, *args, **kwargs)
, 這類的都是後端服務定義的視圖類或者函數, 在 URL 對象中註冊他們, 就能夠實現一個邏輯 API 接口。python
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from django.views import View
class MedusaView(View):
...
複製代碼
第一次接觸到 Django 框架的時候知道的試圖類, 咱們在定義一個試圖類的時候僅僅須要繼承他, 當你須要實現 GET
請求的時候, 你就在你定義的 class 裏面實現 def get(self, request, *args, **kwargs)
方法, 固然 POST
、DELETE
、PUT
等方法都同樣, 只要你在試圖裏定義它, 並返回一個 Response 對象給他。
可是使用 rest-framework 的時候, 咱們都會使用 APIView
的繼承父類,django
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.views import APIView
class MedusaViewSet(APIView):
...
複製代碼
若是你去看了 APIView
的定義, 不難發現它也是繼承了 View
實現的, 可是在 View
的基礎上拓展了不少方法(功能), 咱們在定義視圖的時候更加方便的獲取咱們須要的數據, 返回咱們須要數據。
而且任何 exceptions
的異常信息都會以一種響應狀態碼的方式返回, 你也能夠重寫 handle_exception(self, exc)
方法進行自定義錯誤處理函數響應。
例如你在獲取請求參數的時候能夠用 request.data.get("params")
來獲取 json
請求參數體, 你也能夠經過 request.query_params.get("params")
來獲取 URL 參數, 等價於 request.GET.get("params")
, 具體會在 Request 章節講到。json
若是你習慣了函數視圖的方式, 也給予了你裝飾器修飾函數的方式:後端
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.decorators import api_view
@api_view(['GET'])
def medusa_view(request):
...
複製代碼
固然, 做者仍是認爲類視圖更加具備規範性。api
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework import views, response, status
class Medusa(views.APIView):
def get(self, request, *args, **kwargs):
return response.Response({'detail': 'get'}, status=status.HTTP_200_OK)
def post(self, request, *args, **kwargs):
return response.Response({'detail': 'post'}, status=status.HTTP_201_CREATED)
def delete(self, request, *args, **kwargs):
return response.Response({'detail': 'delete'}, status=status.HTTP_204_NO_CONTENT)
def put(self, request, *args, **kwargs):
return response.Response({'detail': 'put'}, status=status.HTTP_200_OK)
複製代碼