zoukankan      html  css  js  c++  java
  • drg-视图简写流程分析

    视图简写

    1 请求和响应

    1.1 请求

    from rest_framework.request import Resquest
    
    # 在Resuquest中,对原生request进行了一次封装,self._request = request
    def __getattr__(self, item):
        return getattr(self._request, item)
    
    # 请求对象.data中存放的就是三种编码方式传入的数据,都可以取出来
    # 请求对象.query_params 效果等同于django标准的request.GET相同。 
    
    

    1.2 响应

    #from rest_framework.response import Response
     def __init__(self, data=None, status=None,
                     template_name=None, headers=None,
                     exception=False, content_type=None):
    '''
    Response类中的init进行解析:
        data:要返回的数据,字典
        status:返回的状态码 默认是200
            from rest_framework import status中存放的是所有用到的状态码是常量。
        template_name: 渲染的模板名字,有默认的模板,也可以自己定制
        headers:响应头,可以向响应头中放东西。字典
        content_type:响应的编码格式:application/json或text/html
        
        通过浏览器响应会有一个模板文件返回,而postman发出请求返回的是json格式数据,这是通过配置实现的。 
    '''
    
    # 如果把第二个浏览器渲染器注释掉,那么都会返回Json格式数据。
    
    
    # 也可以设置生效范围
        # 局部使用:只针对某个视图类使用
            from rest_framework.renderers import JSONRenderer
            renderer_classes=[JSONRenderer,]
    
        # 也可以设置全局使用
            REST_FRAMEWORK = {
                        'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
                            'rest_framework.renderers.JSONRenderer',  # json渲染器
                        'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
                        )
                    }
    

    2 视图

    两个视图基类:

    1. APIView:继承View类。views.py函数中定义的CBV可以是继承APIView
    2. GenericAPIView:继承APIView类。

    2.1 利用APIView写接口

    # views.py
    from rest_framework.generics import GenericAPIView
    from app01.models import Book
    from app01.ser import BookSerializer
    # 基于APIView写的
    class BooksView(APIView):
        def get(self, request):
            response_dict = Response_dict()
            book_list = models.Book.objects.all()
            book_ser = BookModelSerializer(instance=book_list, many=True)
            response_dict.data = book_ser.data
            return Response(response_dict.dic)
    
        def post(self, request):
            book_ser = BookModelSerializer(data=request.data)
            response_dict = Response_dict()
            if book_ser.is_valid():
                book_ser.save()
                response_dict.data = book_ser.data
            else:
                response_dict.status = 201
                response_dict.msg = '凉凉'
                response_dict.data = book_ser.errors
            return Response(response_dict.dic)
    
    
    class BookView(APIView):
        def get(self,request, pk):
            book_obj = models.Book.objects.filter(pk=pk).first()
            book_ser = BookModelSerializer(instance=book_obj)
            response_dict = Response_dict()
            response_dict.data = book_ser.data
            return Response_dict(response_dict.dic)
    
    
    
        def put(self, request, pk):
            response_dict = Response_dict()
            book_obj = models.Book.objects.filter(pk=pk).first()
            book_ser = BookModelSerializer(instance=book_obj, data=request.data)
            if book_ser.is_valid():
                book_ser.save()
                response_dict.data = book_obj
            else:
                response_dict.status = 202
                response_dict.msg = '数据校验出问题啦'
                response_dict.data = book_ser.errors
            return Response(response_dict.dic)
    
        def delete(self, request, pk):
            models.Book.objects.filter(pk=pk).delete()
            response_dict = Response_dict()
            return Response(response_dict.dic)
    
        
    # urls.py
        url(r'^books/(d+)', views.BookView.as_view())
        url(r'^books/', views.BooksView.as_view())
    

    2.2 基于GenericAPIView写的接口

    from rest_framework.generics import GenericAPIView
    # views.py
    class BooksView(GenericAPIView):
    
        queryset = models.Book.objects
        serializer_class = BookModelSerializer
    
        def get(self, request):
            book_list = self.get_queryset()
            book_ser = self.get_serializer(book_list, many=True)
            return Response(book_ser.data)
    
        def post(self, request):
            book_ser = self.get_serializer(data=request.data)
            if book_ser.is_vaild():
                book_ser.save()
                return Response(book_ser.data)
            else:
                return Response(book_ser.data)
    
    
    class BookView(GenericAPIView):
        queryset = models.Book.objects
        serializer_class = BookModelSerializer
    
        def get(self,request, pk):
            book = self.get_object()
            book_ser = self.get_serializer(book)
            return Response(book_ser.data)
    
        def put(self, request, pk):
            book = self.get_object()
            book_ser = self.get_serializer(insatnce=book, data=request.data)
            if book_ser.is_vaild():
                book_ser.save()
                return Response(book_ser.data)
            else:
                return Response({'status':101, 'msg':'校验失败'})
    
        def delete(self,request, pk):
            ret = self.get_object().delete()
            return Response({'status':100, 'msg':'删除成功'})
        
    # urls.py
        url(r'^books/(?P<pk>d+)', views.BookView.as_view()),
        url(r'^books/', views.BooksView.as_view()),
    

    2.3 基于GenericAPIView和5个视图扩展类写的接口

    from rest_framework.mixins import ListModelMixin, CreateModelMixin, DestroyModelMixin, RetrieveModelMixin,UpdateModelMixin
    
    class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
        queryset=models.Book.objects
        serializer_class = BookModelSerializer
    
        def get(self, request):
            return self.list(request)
    
        def post(self, request):
            return self.create(request)
    
    
    class BooksView(UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, GenericAPIView):
        queryset = models.Book.objects
        serializer_class = BookModelSerializer
    
        def get(self,request, pk):
            return self.retrieve(request, pk)
    
        def patch(self, request, pk):
            return self.update(request, pk)
    
        def delete(self,request, pk):
            return self.destroy(request, pk)
    
    

    2.4 使用ModelViewSet编写5个接口

    # views.py
    from rest_framework.viewsets import ModelViewSet
    
    # 四行代码搞定5个接口
    class BookView(ModelViewSet):
        queryset = model.Book.objects
        serializer_class = BookSerializer
        
    # urls.py
    # 使用ModelViewSet编写5个接口
        url(r'^books/(?P<pk>d+)', views.BookView.as_view(actions={'get':'retrieve', 'put':'update','delete':'destroy'})),
        url(r'^books/', views.BooksView.as_view(actions={'get':'list', 'post':'create'})),
        
        # 路径匹配时,如果是get请求,会执行list方法
    

    2.5 源码分析ViewSetMixin

    # 重写了as_view
    for method, action in actions.items():
        handler = getattr(self, action)  # 使用反射,handler就是对应函数方法的内存地址
        setattr(self, method, handler)  # 反射,设置属性对应handler
        
    

    2.6 继承ViewSetMixin的视图类

    from rest_framework.viewsets import ViewSetMixin
    class BookBiew(ViewSetMixin, APIView):
        def get_all_book(self, request):
            print('xxx')
            book_list = models.Book.objects.all()
            book_ser = BookSerializer(book_list, many=True)
            return Response(book_ser.data)
        
    # urls.py
        # 继承ViewSetMixin的视图类,路由可以改写
        url(r'^books/',views.BookView.as_view(actions={'get':'get_all_book'}))
    
  • 相关阅读:
    《最优化导论》-8梯度方法
    《最优化导论》-7一维搜索方法
    《最优化导论》-6集合约束和无约束优化问题基础
    ubuntu set up 3
    ubuntu set up 2
    ubuntu set up 1
    Xavier and Kaiming Initialization
    Network Initialization: Fan-in and Fan-out
    The Softmax function and its derivative
    GNU Screen使用
  • 原文地址:https://www.cnblogs.com/liqianxin/p/13269940.html
Copyright © 2011-2022 走看看