day-84drf

View family

  1.generics: view class

  2.mixins: expand the view class (Tools)

  3.viewsets: View Sets

View layer:

from rest_framework.generics Import GenericAPIView
 from . Import Models, serializers
 from utils.response Import APIResponse 

# 1.generics: view class 
class BooksGenericAPIView (GenericAPIView): 
    QuerySet = models.Book.objects.filter (is_delete = False) 
    serializer_class = serializers.BooksModelSerializer
     # lookup_field = 'pk' packet # known in the urls, pk is a known packet can be omitted here 
    DEF GET (Self, Request, * args, ** kwargs): 
        pk = kwargs.get ( ' pk')
        if not pk:
            book_query = self.get_queryset()
            book_ser = self.get_serializer(book_query, many=True)
            return APIResponse(0, 'ok', book_ser.data)
        else:
            book_obj = self.get_object()
            book_ser = self.get_serializer(book_obj)
            return APIResponse(0, 'ok', book_ser.data)


# 2.mixins:视图工具集
from rest_framework import mixins
class BooksMixinsGenericAPIView(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BooksModelSerializer
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if not pk:
            return self.list(request, *args, **kwargs)
        else:
            return self.retrieve(request, *args, **kwargs)


# 整合mixins 到 generics 中:不需要自己写功能
from rest_framework.generics import ListCreateAPIView, RetrieveAPIView
class BooksListAPIView(ListCreateAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BooksModelSerializer



#3. viewsets:视图集(整合mixins 到 generics)、
from rest_framework import viewsets
class BooksGenericViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BooksModelSerializer

    def create_many_or_one(self, request, *args, **kwargs):
        request_data = request.data
        many = True if isinstance(request_data, list) else False
        book_ser = serializers.BooksModelSerializer(data=request_data, many=many)
        if book_ser.is_valid():
            book_obj_list = book_ser.save()
            return APIResponse(0, 'ok', serializers.BooksModelSerializer(book_obj_list, many=many).data)
        else:
            return APIResponse(1, 'failed', book_ser.errors)

Routing layer:

from django.conf.urls import url, include
from . import views
urlpatterns = [
    url(r'^v1/books/$', views.BooksGenericAPIView.as_view()),
    url(r'^v1/books/(?P<pk>\d+)/', views.BooksGenericAPIView.as_view()),
    url(r'^v2/books/$', views.BooksMixinsGenericAPIView.as_view()),
    url(r'^v2/books/(?P<pk>\d+)/', views.BooksMixinsGenericAPIView.as_view()),
    url(r'^v3/books/$', views.BooksListAPIView.as_view()),
    url(r'^v3/books/(?P<pk>\d+)/', views.BooksListAPIView.as_view()),

    # 重点:
    url(r'^v4/books/$', views.BooksGenericViewSet.as_view({'get': 'list', 'post': 'create_many_or_one'})),
    url(r'^v4/books/(?P<pk>\d+)/', views.BooksGenericViewSet.as_view({'get': 'retrieve'})),
] 


From rest_framework.routers Import SimpleRouter                                  # another way of v4 
Router = SimpleRouter () 
router.register ( ' v4 / Books ' , views.BooksGenericViewSet, base_name = ' Book ' )         # base_name = 'Book' for the reverse lookup 
# Print (router.get_urls ()) 
# Print (router.urls) 
urlpatterns.extend (router.urls)

Certified Components

Custom certification class

from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
class TokenAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request._request.META.get('HTTP_TOKEN')             # 前后台分离项目,认证字段通常为Token
        if token != '123321':
            raise exceptions.NotAuthenticated('认证失败')
        return None

 

settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework.authentication.BasicAuthentication',
         'api.authentication.TokenAuthentication',              #开启自定义类全局认证
    )
}

View layer

from rest_framework import generics, viewsets, mixins
from . import models, serializers

class UsersRetrieveAPIView(generics.RetrieveAPIView):  
    authentication_classes = ()                                             # 局部解除认证
    queryset = models.User.objects.filter(is_delete=False)
    serializer_class = serializers.UsersModelSerializer

from . import authentication
class CarsGenericViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    authentication_classes = (authentication.TokenAuthentication, )         # 局部开启认证
    queryset = models.Car.objects.filter(is_delete=False)
    serializer_class = serializers.CarsModelSerializer

Routing layer

from django.conf.urls import url, include
from . import views
urlpatterns = [
    url(r'^users/(?P<pk>\d+)/', views.UsersRetrieveAPIView.as_view()),

    url(r'^cars/$', views.CarsGenericViewSet.as_view({'get': 'list'})),
    url(r'^cars/(?P<pk>\d+)/', views.CarsGenericViewSet.as_view({'get': 'retrieve'})),
]

 

Guess you like

Origin www.cnblogs.com/klw1/p/11371283.html