zoukankan      html  css  js  c++  java
  • Django视图基类

    Django视图基类

    Django REST framwork 提供的视图的主要作用:

    • 控制序列化器的执行(检验、保存、转换数据)
    • 控制数据库查询的执行

    一 、视图

    REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写。

    二 、两个视图基类

    2.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
    
    # url(r'^students/$', views.StudentsAPIView.as_view()),
    class StudentsAPIView(APIView):
      	
        def get(self, request):
            data_list = Student.objects.all()
            serializer = StudentModelSerializer(instance=data_list, many=True)
            return Response(serializer.data)
    

    2.2 GenericAPIView ( 通用视图类 )

    rest_framework.generics.GenericAPIView
    

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

    提供的关于序列化器使用的属性与方法

    属性

    • serializer_class 指明视图使用的序列化器

    2.2.2 方法:

    2.2.2.1 get_serializer_class(self)

    当出现一个视图类中调用多个序列化器时,那么可以通过条件判断在get_serializer_class方法中通过返回不同的序列化器类名就可以让视图方法执行不同的序列化器对象了。

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

    def get_serializer_class(self):
    	if self.request.user.is_staff:
    		return FullAccountSerializer
    	return BasicAccountSerializer
    
    2.2.2.2 get_serializer(self, *args, **kwargs)

    返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。

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

    -   **request** 当前视图的请求对象
    -   **view** 当前请求的类视图对象
    -   format 当前请求期望返回的数据格式
    

    提供的关于数据库查询的属性与方法

    • 属性:

    • queryset 指明使用的数据查询集

    • 方法:

    • get_queryset(self)

        返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,
        默认返回`queryset`属性,可以重写,例如:
    
        ```python
        def get_queryset(self):
            user = self.request.user
            return user.accounts.all()
        ```
    
    -   **get_object(self)**
    
        返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。
    
        在试图中可以调用该方法获取详情信息的模型类对象。
    
        **若详情访问的模型类对象不存在,会返回404。**
    
        该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
    
        举例:
    
        ```python
        # 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() # get_object()方法根据pk参数查找queryset中的数据对象
                serializer = self.get_serializer(book)
                return Response(serializer.data)
        ```
    

    其他可以设置的属性

    -pagination_class 指明分页控制类
    -filter_backends 指明过滤控制后端

    为了方便学习上面的GenericAPIView通用视图类,我们新建一个子应用。

    python manage.py startapp gen
    

    代码:

    from rest_framework.generics import GenericAPIView
    
    from students.models import Student
    from .serializers import StudentModelSerializer, StudentModel2Serializer
    from rest_framework.response import Response
    
    class StudentsGenericAPIView(GenericAPIView):
        # 本次视图类中要操作的数据[必填]
        queryset = Student.objects.all()
        # 本次视图类中要调用的默认序列化器[玄天]
        serializer_class = StudentModelSerializer
    
        def get(self, request):
            """获取所有学生信息"""
            serializer = self.get_serializer(instance=self.get_queryset(), many=True)
    
            return Response(serializer.data)
    
        def post(self,request):
    
            data = request.data
    
            serializer = self.get_serializer(data=data)
    
            serializer.is_valid(raise_exception=True)
    
            instance = serializer.save()
    
            serializer = self.get_serializer(instance=instance)
    
            return Response(serializer.data)
    
    
    class StudentGenericAPIView(GenericAPIView):
        queryset = Student.objects.all()
    
        serializer_class = StudentModelSerializer
    
        def get_serializer_class(self):
            """重写获取序列化器类的方法"""
            if self.request.method == "GET":
                return StudentModel2Serializer
            else:
                return StudentModelSerializer
    
        # 在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk
        def get(self,request,pk):
            """获取一条数据"""
            serializer = self.get_serializer(instance=self.get_object())
    
            return Response(serializer.data)
    
        def put(self,request,pk):
    
            data = request.data
    
            serializer = self.get_serializer(instance=self.get_object(),data=data)
    
            serializer.is_valid(raise_exception=True)
    
            serializer.save()
    
            serializer = self.get_serializer(instance=self.get_object())
    
            return Response(serializer.data)
    

    序列化器类:

    from rest_framework import serializers
    
    from students.models import Student
    
    class StudentModelSerializer(serializers.ModelSerializer):
        class Meta:
            model= Student
            fields = "__all__"
    
    
    class StudentModel2Serializer(serializers.ModelSerializer):
        class Meta:
            model= Student
            fields = ("name","class_null")
    
  • 相关阅读:
    Python 描述符(descriptor) 杂记
    Celery 使用简介
    异步任务神器 Celery 简明笔记
    高性能框架gevent和gunicorn在web上的应用及性能测试
    Flask + Gunicorn + Nginx 部署
    Mysql查看最大连接数和修改最大连接数
    配置 influxDB 鉴权及 HTTP API 写数据的方法
    Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次
    linux端口开放指定端口的两种方法
    java自带的监控工具VisualVM一
  • 原文地址:https://www.cnblogs.com/Dr-wei/p/11735502.html
Copyright © 2011-2022 走看看