DRF提供了一種函數基礎視圖來裝飾Django的普通視圖,咱們可使用request來接受請求和response響應。一個小例子:數據庫
from rest_framework.decorators import api_view @api_view def hello_world(request): return Response({"message":"Hello world!"})
這個視圖將使用默認渲染器、解析器、身份驗證設置中指定的類等。一般默認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!'})
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()函數
DRF不一樣於Django常規的View類,它有以下幾個優勢:post
一個小例子: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)
一般不用重寫。spa
基於類視圖的主要好處之一是他們容許您編寫可重用的行爲。REST框架提供的通用視圖容許您快速構建API觀點緊密地映射到您的數據庫模型。GenericAPIView繼承了DRF的APIView類,爲list和detail視圖增長了一些通常需求行爲方法。rest
基本屬性:code
分頁屬性:
過濾器屬性:
基本方法:
mixin類用於提供基礎視圖的操做行爲。注意,mixin類提供操做方法而不是定義處理程序方法,這容許更靈活的組合的行爲。
如下方法是mixins類提供,提供簡單的對象保存和刪除的行爲重寫:
該通用類視圖提供具體操做的通用類視圖,能夠理解GenericAPIView和Mixin類的合體,經過rest_framework.generic調用。
建立一個模型實例
提供post方法的處理器
繼承於:GenericAPIView,CreateModelMixin
模型實例的集合
提供get方法處理器
繼承於:GenericAPIView,ListModelMixin
一個模型實例
提供get方法處理器
繼承於:GenericAPIView,RetrieveModelMixin
刪除一個模型實例
提供delete方法處理器
繼承於:GenericAPIView,DestroyModelMixin
修改模型實例,
提供put和patch方法處理器
繼承於:GenericAPIView,UpdateModelMixin
建立和展現一個模型實例集合
提供get和post處理器
繼承於:GenericAPIView,ListModelMixin,CreateModelMixin
讀和改一個模型實例
提供get,put,patch處理器
繼承於:GenericAPIView,RetrieveModelMixin,UpdateModelMixin
讀和刪除一個模型實例
提供get和delete處理器
繼承於:GenericAPIView,RetrieveModelMixin,DestroyModelMixin
讀、改和刪一個模型實例
get, put, patch,delete處理器
繼承於:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
Django REST框架容許您將一組相關的邏輯視圖在一個類,ViewSet類是一個簡單類型的基於類的視圖,沒有提供任何方法處理程序如get(),post()等,而提供代替方法好比list(),retrieve(),create(),update(),destroy()等。
繼承了`GenericAPIView`,提供了默認的get_queryset()和get_object()等方法來獲取model數據,但不提供任何請求處理方法。
繼承了`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)
繼承了GenericAPIView,只增長了只讀的請求處理方法list()和retrieve()。
例子:
class UserViewSet(ReadOnlyModelViewSet): # 繼承涵蓋`ListModelMixin`、`CreateModelMixin`、`RetrieveModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等; # 按Model分別寫視圖集合,一個Model一個視圖集合。 """ 此視圖自動提供`list()`和`retrieve()`操做。 """ queryset = User.objects.all() serializer_class = UserSerializer
例:
# 手動配置視圖集合路由: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'),
經過使用Router類,把視圖和資源聯繫起來的協議和urls會被自動處理。咱們只須要使用router來註冊合適的視圖,剩餘的交給router來作就行。
例:
# 實例化一個 router 並用它註冊咱們的 viewset router = DefaultRouter() router.register(r'snippets', SnippetViewSet) # API URLs如今由 router 自動配置 urlpatterns = [ path('', include(router.urls)), ]
至此。轉載請註明出處。