zoukankan      html  css  js  c++  java
  • Django REST framework -- Class-based Views

    Class-based Views

    https://www.django-rest-framework.org/tutorial/3-class-based-views/

    APIView 继承于 django view类
    提供了 http method 方法的抽象, 即继承于此类的应用类中, 可以定义 get post 等方法, 来处理对应的http方法请求。

    获取全部实例 和 创建实例。
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    from django.http import Http404
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    
    
    class SnippetList(APIView):
        """
        List all snippets, or create a new snippet.
        """
        def get(self, request, format=None):
            snippets = Snippet.objects.all()
            serializer = SnippetSerializer(snippets, many=True)
            return Response(serializer.data)
    
        def post(self, request, format=None):
            serializer = SnippetSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    对单个实例 修改 获取 和 删除。

    class SnippetDetail(APIView):
        """
        Retrieve, update or delete a snippet instance.
        """
        def get_object(self, pk):
            try:
                return Snippet.objects.get(pk=pk)
            except Snippet.DoesNotExist:
                raise Http404
    
        def get(self, request, pk, format=None):
            snippet = self.get_object(pk)
            serializer = SnippetSerializer(snippet)
            return Response(serializer.data)
    
        def put(self, request, pk, format=None):
            snippet = self.get_object(pk)
            serializer = SnippetSerializer(snippet, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
        def delete(self, request, pk, format=None):
            snippet = self.get_object(pk)
            snippet.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)

    将定义的业务类, 调用其 as_view 转换为 普通的django view处理函数(接受一个参数 request实例, 函数中返回 reponse实例)

    from django.urls import path
    from rest_framework.urlpatterns import format_suffix_patterns
    from snippets import views
    
    urlpatterns = [
        path('snippets/', views.SnippetList.as_view()),
        path('snippets/<int:pk>/', views.SnippetDetail.as_view()),
    ]
    
    urlpatterns = format_suffix_patterns(urlpatterns)

    Using mixins

    对于更加普适的模型处理逻辑, 应该有更加普适的view模式类来处理, 不用业务编写者来实现 get post函数的业务逻辑。

    restframework提供了 GenericAPIView , 此类继承于 APIView

    封装了 get post等通用的模型处理方法,

    继承此类的业务类,指定queryset 和 serializer类, 然后在 get post方法中调用  MIXIN 类封装好的业务逻辑函数。

    获取全部实例 和 创建单个实例。

    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    from rest_framework import mixins
    from rest_framework import generics
    
    class SnippetList(mixins.ListModelMixin,
                      mixins.CreateModelMixin,
                      generics.GenericAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)

    单个实例的获取 更新 删除。

    class SnippetDetail(mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        mixins.DestroyModelMixin,
                        generics.GenericAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)

    Using generic class-based views

    如果get post函数中没有定制化的逻辑, 则使用 具体的业务APIView 则更加合适。

    这样 get post函数的定义也可以省略了。

    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    from rest_framework import generics
    
    
    class SnippetList(generics.ListCreateAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
    
    
    class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer

    GenericAPIView

    https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

    This class extends REST framework's APIView class, adding commonly required behavior for standard list and detail views.

    Each of the concrete generic views provided is built by combining GenericAPIView, with one or more mixin classes.

    Mixins

    https://www.django-rest-framework.org/api-guide/generic-views/#mixins

    The mixin classes provide the actions that are used to provide the basic view behavior. Note that the mixin classes provide action methods rather than defining the handler methods, such as .get() and .post(), directly. This allows for more flexible composition of behavior.

    The mixin classes can be imported from rest_framework.mixins

    Concrete View Classes

    https://www.django-rest-framework.org/api-guide/generic-views/#concrete-view-classes

    The following classes are the concrete generic views. If you're using generic views this is normally the level you'll be working at unless you need heavily customized behavior.

    The view classes can be imported from rest_framework.generics.

    http://blogs.thebitx.com/index.php/2021/09/29/django-rest-framework-views-generic-views/

    继承图

    http://blogs.thebitx.com/index.php/2021/09/29/django-rest-framework-views-generic-views/

    https://www.cnblogs.com/shijieli/p/10273610.html

    出处:http://www.cnblogs.com/lightsong/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    html(单纯html标签)
    python 知识点
    浅谈五大Python Web框架
    Python3的变化
    测试开发
    常见的测试用例设计方法
    数字数据类型及其对应转移字符
    char *p 与char p[]
    C语言运算符优先级 详细列表
    软件自动化测试
  • 原文地址:https://www.cnblogs.com/lightsong/p/15399913.html
Copyright © 2011-2022 走看看