• rest_framework视图基类与五个扩展类


    1. 两个基类

    1)APIView

    rest_framework.views.APIView

    APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

    APIView与View的不同之处在于:

    传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;

    视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;

    任何APIException异常都会被捕获到,并且处理成合适的响应信息;

    在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

    支持定义的属性:

    authentication_classes 列表或元祖,身份认证类

    permissoin_classes 列表或元祖,权限检查类

    throttle_classes 列表或元祖,流量控制类

    在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。

    举例:

    复制代码
    from rest_framework.views import APIView
    from rest_framework.response import Response
     
    class BookListView(APIView):
        def get(self, request):
            books = BookInfo.objects.all()
            serializer = BookInfoSerializer(books, many=True)
            return Response(serializer.data)

    复制代码

    2)GenericAPIView
    rest_framework.generics.GenericAPIView

    继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。

    支持定义的属性:
    列表视图与详情视图通用:
    queryset 列表视图的查询集
    serializer_class 视图使用的序列化器


    列表视图使用:
    pagination_class 分页控制类
    filter_backends 过滤控制后端


    详情页视图使用:
    lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
    lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同


    提供的方法:
    列表视图与详情视图通用:

    get_queryset(self)

    返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

    def get_queryset(self):

    if self.action == 'list':
    return Area.objects.filter(parent=None)
    else:
    return Area.objects.all()

     

    get_serializer_class(self)

    返回序列化器类,默认返回serializer_class,可以重写,例如:

    def get_serializer_class(self):

    if self.action == 'list':
    return serializers.AreaSerializer
    else:
    return serializers.SubAreaSerializer

    get_serializer(self, args, *kwargs)
    返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。

    注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

    详情视图使用:

    get_object(self)

     返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。

    若详情访问的模型类对象不存在,会返回404。

    该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

    复制代码
    # url(r'^books/(?P<pk>d+)/$', views.BookDetailView.as_view()),
    class BookDetailView(GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
     
        def get(self, request, pk):
            book = self.get_object()
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    复制代码

     

  • 相关阅读:
    Enterprise Library 2.0 Hands On Lab 翻译(9):缓存应用程序块(一)
    Enterprise Library 2.0 Hands On Lab 翻译(5):日志应用程序块(二)
    提供多单词建议的自定义AutoCompleteExtender
    什么是 axios
    Consul是一个分布式高可用的系统
    全栈开发工程师
    XPath路径表达式
    9 个带你阅读源码的开源项目
    前端跨域解决方案
    [WCFDiscovery]让服务自动发送上/下线通知[原理篇]
  • 原文地址:https://www.cnblogs.com/pythonlyz/p/10323280.html
Copyright © 2020-2023  润新知