zoukankan      html  css  js  c++  java
  • RestFramework中的视图类

    昨天写了post请求和get请求的接口,今天写剩下的。

                            GET              
                    books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
                            POST
                    books-------->添加数据--------------------->返回添加数据 :{}
                            PUT
                    books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
                            Delete
                    books/1-------> 删除pk=1的数据-------------->返回空
                            GET
                    books/1------->查看单条数据   --------------->返回查看的单条数据 {}

    我们都看到剩下的put,delete,get的url中都需要传一个id参数,这必然不能再原来的视图中写,所以需要另写一个url和视图

    对于一张表可以这样做,但是当有多个表的时候,我们就要写多个这样的代码,里面重复的代码会很多,我们想着能不能把这get,post,put,delete,get这五个请求方式写成五个类,然后Bookview和SBookview分别继承自己相应的请求方式类,

    举一个简单例子来说一下:

    这就是rest_framework的视图类了。

    其实这些类不用我们写,因为rest_framework 已经帮我们做好了。来看代码:

    from rest_framework import generics
    from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
    
    class PublishView(ListModelMixin,CreateModelMixin,generics.GenericAPIView):
        queryset = Publish.objects.all()   #获取所有publish
        serializer_class = PublishSerializer  # 序列化
        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 SPublishView(UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin,generics.GenericAPIView):
        queryset = Publish.objects.all()
        serializer_class = PublishSerializer
        def put(self,request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
        def delete(self,request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
        def get(self,request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)

    这样写好之后,在url要写上命名分组:


    from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin

    其实我们点进 ListModelMixin 的源码可以看见:里面写的方法和我们之前处理请求的方法差不多是一样的,所以同理在其他的类中都会有相应的方法去处理相应的请求。

    这样写已经很简便了,但是这样写仍然有重复的代码,那些处理请求的代码都是一样的,所以还是能够简便的

     

    同样url要分组命名:

    但这并不是最终的版本,因为我们对一个model写了两个视图,这固然不好。

    这样写了之后,url中需要传个参数:

    我们来解读一下这个终极版本的源码:

    先从AuthorView中找as_view,如果找不到,就从他的父类ModelViewSet中寻找,

    如果还没有,就一层一层往上找,最终找到了ViewSetMixin,

     我们知道as_view方法最终返回的是view,

    在view方法中,

    然后返回self.dispatch,然后从APIView中找dispatch方法:

    在dispatch方法中做相应请求方式的分发。

    一旦用户访问,get访问authors/:
                ViewSetMixin.view(reqeust):
                             for method, action in actions.items(): # {"get":"list","post":"create"}
                                    handler = getattr(self, action) #  handler===self.list
                                    setattr(self, method, handler)  #  self.get=self.list

                             return self.dispatch(request, *args, **kwargs)   
                             APIView.dispatch(request):
                                                     
                                                      handler = getattr(self, request.method.lower())    #  self.get = self.list
                                                      response = handler(request, *args, **kwargs)    
                                                                    # def list(self.request):
                       `                                                  # return Response(serializer.data)
                                                                
                                                      return response
































  • 相关阅读:
    学习笔记之C++ How to Program(part)
    Makefile相关资料
    [ZZ]指针Guide
    [ZZ]make命令与makefile文件的写法
    SQLite数据库简介及资源下载
    程序员天生码农命?
    Application标签中有三个事件运行顺序
    Flex 项目案例集锦
    flex简介
    Flex连接数据库三种方法
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9674563.html
Copyright © 2011-2022 走看看