REST framework 视图类之APIView与GenericAPIView

APIView 基础视图类

rest_framework.views.APIView

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

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  • APIView重写了as_view方法,调用View的as_view方法,并禁用csrf
  • APIView重写了dispatch方法,二次封装request,在分发前会对请求进行身份认证、权限检查、流量控制。

支持定义的属性

  • authentication_classes 列表或元祖,身份认证类
  • permissoin_classes 列表或元祖,权限检查类
  • throttle_classes 列表或元祖,流量控制类

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

from rest_framework.views import APIView
from rest_framework.response import Response

# url(r'^books/$', views.BookListView.as_view()),
class BookListView(APIView):
    def get(self, request):
        books = BookInfo.objects.all()
        serializer = BookInfoSerializer(books, many=True)
        return Response(serializer.data

GenericAPIView 通用视图类

rest_framework.generics.GenericAPIView

继承自APIVIew,完全兼容APIView,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。

三个属性与方法

属性;

  • queryset              指明使用的数据查询集
  • serializer_class   指明视图使用的序列化器
  • lookup_field        指定pk

方法:

  • get_queryset()     从类属性queryset中获得model的queryset数据
  • get_object()         从类属性queryset中获得model的queryset数据,再通过有名分组pk确定唯一操作对象
  • get_serializer()    从类属性serializer_class中获得serializer的序列化类

使用

  • urls.py
urlpatterns = [
    url(r'^v2/books/$', views.BookGenericAPIView.as_view()),
    url(r'^v2/books/(?P.*)/$', views.BookGenericAPIView.as_view()),
]
# BookGenericAPIView.as_view() => 调用的是APIView的as_view() => View的as_view() => APIView的dispatch完成分发
  • views.py
from rest_framework.generics import GenericAPIView
# BookGenericAPIView.as_view() => 调用的是APIView的as_view() => View的as_view() => APIView的dispatch完成分发
class BookGenericAPIView(GenericAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer
    lookup_field = 'pk'  # 单查是要指定lookup_field = 'pk'属性
    
    # 群查:
    def get(self, request, *args, **kwargs):
        book_query = self.get_queryset()  # 会自动将queryset传入,得到model类的queryset对象
        book_ser = self.get_serializer(book_query, many=True)  # 等同于BookModelSerializer序列化
        book_data = book_ser.data
        return APIResponse(results=book_data)
    
    # 单查:
    def get(self, request, *args, **kwargs):
        book_obj = self.get_object()  # 会自动将queryset传入,并调用lookup_field属性,得到model类的具体的一条记录(即:对象)
        book_ser = self.get_serializer(book_obj)
        book_data = book_ser.data
        return APIResponse(results=book_data)

 

你可能感兴趣的:(REST,framework)