REST-framework快速构建API--源码解析

一、APIView

通过APIView实现API的过程如下:

urls.py

   url(r'^books/$', views.BookView.as_view(),name="books"),
    url(r'^books/(\d+)/$', views.BookDetailView.as_view(),name="detailbook"),

views.py

class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all()
        bs = BookModelSerializers(book_list, many=True, context={'request': request})
        return Response(bs.data)

    def post(self, request):
        # post请求的数据
        bs = BookModelSerializers(data=request.data)
        if bs.is_valid():
            print(bs.validated_data)
            bs.save()  # create方法
            return Response(bs.data)
        else:
            return Response(bs.errors)


class BookDetailView(APIView):

    def get(self, request, id):

        book = Book.objects.filter(pk=id).first()
        bs = BookModelSerializers(book, context={'request': request})
        return Response(bs.data)

    def put(self, request, id):
        book = Book.objects.filter(pk=id).first()
        bs = BookModelSerializers(book, data=request.data, context={'request': request})
        if bs.is_valid():
            bs.save()
            return Response(bs.data)
        else:
            return Response(bs.errors)

    def delete(self, request, id):
        Book.objects.filter(pk=id).delete()

        return Response()
 
 

urls中,定义了两个url的请求方式:

  • 通过URL:http://127.0.0.1/books/   GET/POST数据

  • 通过URL:http://127.0.0.1/books/id/   GET/PUT/DELETE数据

第一种,url(r'^books/$', views.BookView.as_view(),name="books"),调用过程如下:

views.BookView.as_view()

  1、APIView.as_view(),返回view,实际上是执行View.as_view()

    2、View中的as_view()返回disptch()函数

      3、self会从View类往上找dispatch(),在APIView类中有找到dispatch()

        4、dispatch()会找get、post、put、delete等方法

          5、在当前View下,BookView类下定义了get、post,BookDetailView类下定义了get、put、delete

            6、执行当前类下的对应方法

第二种URL执行过程一样。

二、ModelView

通过ModelView实现API过程如下:

urls.py

 url(r'^authors/$', views.AuthorModelView.as_view({'get':'list','post':'create'}),name="authors"),
    url(r'^authors/$', views.AuthorModelView.as_view({'get':'retrieve','post':'update','delete':'destory'}),name="authors"),

views.py

class AuthorModelView(viewsets.ModelViewSet):

    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers
  

执行过程如下:

1、当前类下没有as_view方法,从父类ModelViewSet中查找

 
class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass
 

2、ModeViewSet在mixins中没有as_view,从GenericViewSet往上找

 
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
    """
    The GenericViewSet class does not provide any actions by default,
    but does include the base set of generic view behavior, such as
    the `get_object` and `get_queryset` methods.
    """
    pass
 

3、从ViewSetMixin中找到了as_view(),实际上返回了dispatch()

ViewSetMixin==>generics.GenericAPIView==>views.APIView==>dispatch()

4、执行dispatch(),实际上是找get、post、put、delete等方法

5、在当前类下找到对应的方法

 

 

三、认证实现

四、权限实现

猜你喜欢

转载自www.cnblogs.com/skyflask/p/10422335.html
今日推荐