Django RestFramework(DRF)類視圖

基礎視圖

1.基礎函數視圖(@api_view)

DRF提供了一種函數基礎視圖來裝飾Django的普通視圖,咱們可使用request來接受請求和response響應。一個小例子:數據庫

from rest_framework.decorators import api_view

@api_view
def hello_world(request):
    return Response({"message":"Hello world!"})

1)@api_view使用方法

這個視圖將使用默認渲染器、解析器、身份驗證設置中指定的類等。一般默認GET方法,咱們能夠手動更改方法。像這樣:django

@api_view(['GET', 'POST'])
def hello_world(request):
    if request.method  == 'POST':
        return Response({'message':'Got some data', 'data':request.data})
    return Response({'messsage':'Hello world!'})

2)其餘裝飾器

DRF提供了不少附加的裝飾器,咱們能夠添加到@api_view()後面,例如要加入一個節流的裝飾器來確保特定用戶天天只能一次經過這個視圖,咱們就要用到@throttle_classes裝飾器:api

from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle
 
class OncePerDayUserThrottle(UserRateThrottle):
    rate = '1/day'
 
    @api_view(['GET'])
    @throttle_classes([OncePerDayUserThrottle])
    def view(request):
        return Response({'message':'Hello for to day! see you tomorrow!'})

還有:框架

@renderer_classes()
@parser_classes()
@authentication_classes()
@throttle_classes()
@permission_classes()函數

2.基礎類視圖(APIView)

DRF不一樣於Django常規的View類,它有以下幾個優勢:post

  • 提供了更好用的request對象,不一樣於普通的Django HttpRequest更好用。
  • 封裝了Response對象,代替了原有的Django HttpResponse,視圖將管理內容協商並設置正確的渲染器的響應。
  • 任何APIException異常將會被捕捉,並作適當的響應。
  • 傳入的請求將身份驗證和適當的權限和節流檢查將以前運行調度請求處理程序的方法。

一個小例子:url

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authenication, permissions
 
class ListUser(APIView):
    authentication_classes = (authentication.TokenAuthentication,)    # 認證策略屬性
    permission_classes = (permissions.IsAdminUser,)     # 權限策略屬性
    def get(self, requeset, format=None):
        """
        返回一個用戶列表
        """
        usernames = [user.username for user in  User.objects.all()]
        return Response(usernames)

1)APIView屬性

  • renderer_classes: 渲染器類
  • parser_classes: 解析器類
  • authentication_classes: 驗證類
  • throttle_classes:限流類
  • permission_classes: 權限類
  • content_negotiation_class: 內容協商類

2)get型方法

一般不用重寫。spa

  • get_renderers(self): 獲取渲染器方法
  • get_parsers(self): 獲取解釋器方法
  • get_authenticators(self): 獲取認證方法
  • get_throttles(self): 獲取限流方法
  • get_permissions(self): 獲取權限方法
  • get_content_negotiator(self): 獲取內容協商方法

3)check型方法

  • check_permissions(self, request): 檢查權限
  • check_throttles(self, request): 檢查節流
  • check_content_negotiation(self, request, force=False): 檢查內容協商

4)調度方法

  • initial(self, request, *args, **kwargs): 執行任何操做,須要發生在處理程序方法以前被調用。這個方法是用來執行權限和節流,並執行內容協商。
  • handle_exception(self, exc):拋出的任何異常處理程序方法將被傳遞給這個方法,而返回響應實例,或者re-raises異常。
  • initialize_request(self, request, *args, **kwargs):確保請求對象傳遞給處理程序方法是request的一個實例,而不是django的HttpRequest
  • finalize_response(self, request, response, *args, **kwargs):確保任何響應處理程序方法返回的對象將被呈現到正確的內容類型

通用類視圖

基於類視圖的主要好處之一是他們容許您編寫可重用的行爲。REST框架提供的通用視圖容許您快速構建API觀點緊密地映射到您的數據庫模型。GenericAPIView繼承了DRF的APIView類,爲list和detail視圖增長了一些通常需求行爲方法。rest

1.基礎通用類視圖(GenericAPIView)

1)屬性

基本屬性:code

  • queryset: 用於返回query對象集合,也可使用get_queryset()方法
  • serializer_class: 序列化器類,應該用於輸入進行驗證和反序列化,並用於序列化輸出。一般狀況下,你必須設置這個屬性,或重寫get_serializer_class()方法
  • lookup_field: 模型的字段應該用於執行對象查找個別的模型實例
  • lookup_url_kwarg:URL配置中應該用於對象查找關鍵字參數

分頁屬性:

  • pagination_class: 用於返回一個分頁列表視圖的分頁類,默認與settings中設置的DEFAULT_PAGINATION_CLASS 值相同,能夠經過’rest_framework.pagination.PageNumberPagination’設置分頁數

過濾器屬性:

  • filter_backends: 過濾queryset的類列表,和在settings中設置DEFAULT_FILTER_BACKENDS同樣

 2)方法

基本方法:

  • get_queryset(): 返回queryset
  • get_object():獲取某一個具體的model實例對象

2.Model Mixin類

mixin類用於提供基礎視圖的操做行爲。注意,mixin類提供操做方法而不是定義處理程序方法,這容許更靈活的組合的行爲。

  • ListModelMixin:提供list方法,列出queryset
  • CreateModelMixin: 提供create方法,建立和保存一個Model對象
  • RetrieveModelMixin:提供retrieve方法,檢索一個存在的model對象
  • UpdateModelMixin: 提供Update方法,更改一個模型對象
  • DestroyModelMixin:提供destroy方法,刪除一個模型對象

如下方法是mixins類提供,提供簡單的對象保存和刪除的行爲重寫:

  • perform_create(self, serializer): CreateModelMixin 當要保存對象時候會被調用
  • perform_update(self, serializer):UpdateModelMixin 當要更新對象時候會被調用
  • perform_destroy(self, instance): DestoryModelMixin 當藥刪除對象時候會被調用

3.高級通用類視圖

該通用類視圖提供具體操做的通用類視圖,能夠理解GenericAPIViewMixin類的合體,經過rest_framework.generic調用。

  • CreateAPIView

建立一個模型實例
提供post方法的處理器
繼承於:GenericAPIView,CreateModelMixin

  • ListAPIView

模型實例的集合
提供get方法處理器
繼承於:GenericAPIView,ListModelMixin

  • RetrieveAPIView

一個模型實例
提供get方法處理器
繼承於:GenericAPIView,RetrieveModelMixin

  • DestoryAPIView

刪除一個模型實例
提供delete方法處理器
繼承於:GenericAPIView,DestroyModelMixin

  • UpdateAPIView

修改模型實例,
提供put和patch方法處理器
繼承於:GenericAPIView,UpdateModelMixin

  • ListCreateAPIView

建立和展現一個模型實例集合
提供get和post處理器
繼承於:GenericAPIView,ListModelMixin,CreateModelMixin

  • RetrieveUpdateAPIView

讀和改一個模型實例
提供get,put,patch處理器
繼承於:GenericAPIView,RetrieveModelMixin,UpdateModelMixin

  • RetrieveDestoryAPIView

讀和刪除一個模型實例
提供get和delete處理器
繼承於:GenericAPIView,RetrieveModelMixin,DestroyModelMixin

  • RetrieveUpdateDestroyAPIView

讀、改和刪一個模型實例
get, put, patch,delete處理器
繼承於:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin

視圖集合

Django REST框架容許您將一組相關的邏輯視圖在一個類,ViewSet類是一個簡單類型的基於類的視圖,沒有提供任何方法處理程序如get(),post()等,而提供代替方法好比list(),retrieve(),create(),update(),destroy()等。

1)GenericViewSet

繼承了`GenericAPIView`,提供了默認的get_queryset()和get_object()等方法來獲取model數據,但不提供任何請求處理方法。

2)ModelViewSet

繼承了`GenericAPIView`,`ListModelMixin`、`RetrieveModelMixin`、`CreateModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等,增長了一些請求處理方法,如list(),retrieve(),create(),update(),partial_update(),destroy()等。

 例子:

class SnippetViewSet(ModelViewSet):
    # 繼承涵蓋`ListModelMixin`、`RetrieveModelMixin`、`CreateModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等;
    # 按Model分別寫視圖集合,一個Model一個視圖集合。
    """
    此視圖自動提供`list()`,`create()`,`retrieve()`,`update()`和`destroy()`操做。
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
  def perform_create(self, serializer):
  serializer.save(owner=self.request.user)

3)ReadOnlyModelViewSet

繼承了GenericAPIView,只增長了只讀的請求處理方法list()和retrieve()。

例子:

class UserViewSet(ReadOnlyModelViewSet):
    # 繼承涵蓋`ListModelMixin`、`CreateModelMixin`、`RetrieveModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等;
    # 按Model分別寫視圖集合,一個Model一個視圖集合。
    """
    此視圖自動提供`list()`和`retrieve()`操做。
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer

給視圖集合綁定URL

1)手動綁定

例:

# 手動配置視圖集合路由:as_view({'action方法': '對象操做方法'})
path('snippets', SnippetViewSet.as_view({'get': 'list', 'post': 'create'}), name='snippets-list'),
path('snippets/<int:pk>', SnippetViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}), name='snippet-detail'),   

2)自動綁定(URL路由器)

經過使用Router類,把視圖和資源聯繫起來的協議和urls會被自動處理。咱們只須要使用router來註冊合適的視圖,剩餘的交給router來作就行。 

例:

# 實例化一個 router 並用它註冊咱們的 viewset
router = DefaultRouter()
router.register(r'snippets', SnippetViewSet)

# API URLs如今由 router 自動配置
urlpatterns = [
    path('', include(router.urls)),
]

 

至此。轉載請註明出處。

相關文章
相關標籤/搜索