(3)DRF框架——视图

两个基本类视图

1.APIView

rest_framework.views.APIView

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

APIViewView的不同之处在于:

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
支持定义的属性:
  • authentication_classes 列表或元祖,身份认证类
  • permissoin_classes 列表或元祖,权限检查类
  • throttle_classes 列表或元祖,流量控制类

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

 

 

请求

REST框架重新视图的请求对象不再是Django的HttpRequest对象,其他REST框架提供的扩展了HttpRequest类的Request类的对象

常用属性

1).资料

request.data返回解析之后的请求体数据。遵循Django中标准的request.POST和 request.FILES属性,但提供如下特性:

  • 包含了解析之后的文件和非文件数据
  • 包含了对POST,PUT,PATCH请求方式解析后的数据
  • 利用了REST框架的解析器解析器,既支持表单类型数据,也支持JSON数据

2).query_params

request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已

响应

rest_framework.response.Response

 

REST框架提供了一个响应类Response,使用该类结构响应对象时,响应的特定数据内容会被转换(渲染)成符合前端需求的类型。

构造方式

Response(data, status=None, template_name=None, headers=None, content_type=None)

data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST框架会使用renderer渲染器处理data

data不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer序列化器序列化处理后(转为了Python字典类型)再传递给data参数。

参数说明:

  • data:为响应准备的序列化处理后的数据;
  • status:状态码,预设200;
  • template_name:模板名称,如果使用HTMLRenderer时需指明;
  • headers:用于存放响应头信息的字典;
  • content_type:响应数据的Content-Type,通常此参数无需传递,REST框架会根据前端所需类型数据来设置该参数

 

例子

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

class BooksView(APIView):

    def post(self,request):#request变了
        # 获取查询字符串
        
        # zz =request.GET.get('a')#之前查询参数获取方法
        zz = request.query_params
        
        #获取前端数据
        
        # data = request.body.decode()#之前的数据转换
        # data_dic = json.loads(data)
        data = request.data
        
        # 验证数据
        
        ser = BookModelSerislzier(data=data)
        ser.is_valid()#验证方法 并且有错误自动返回错误信息
        #保存数据
        #返回结果
        return Response(ser.errors)#Response变了

 

2.GenericAPIView

rest_framework.generics.GenericAPIView

继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。

支持定义的属性:
  • 列表视图与详情视图通用:
    • queryset 列表视图的查询集
    • serializer_class 视图使用的序列化器
  • 列表视图使用:
    • pagination_class 分页控制类
    • filter_backends 过滤控制后端
  • 详情页视图使用:
    • lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
    • lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同

例子

from rest_framework.generics import GenericAPIView
from .models import BookInfo
from .serializer import BookModelSerislzier
from rest_framework.response import Response

# Create your views here.
class BooksView(GenericAPIView):

    queryset = BookInfo.objects.all()#指定当前类视图使用的查询集数据
    serializer_class = BookModelSerislzier #指定类视图使用的序列化器类 注意后面没有括号 只是类名

    def get(self,request):
        #查询所有图书对象
        books = self.get_queryset()#查询查询集中的所有数据
        ser = self.get_serializer(books,many=True)#实例化序列化器

        return Response(ser.data)

    def post(self,request):
        #获取前端数据
        data = request.data
        # 验证数据
        ser = self.get_serializer(data=data,)  # 实例化序列化器
        ser.is_valid()
        #保存数据
        ser.save()
        #返回结果
        return Response(ser.errors)
    def put(self,request,pk):
        data =request.data
        try:
            book =self.get_object()#从查询集中获取指定的单一数据对象
        except:
            return Response({"error":'错误信息'},status=400)
        ser = self.get_serializer(book,data=data)
        ser.is_valid()
        ser.save()
        return Response(ser.data)

 

五个拓展类(配合GenericAPIview使用)继承自object

虽然这些拓展类不继承自GenericAPIview  但是这些拓展类中用到了GenericAPIview中的方法 所以要配合使用

1 ListModelMixin 获取多个数据对象

2 CreateModelMixin  保存数据

3 RetrieveModelMixin  获取单一数据对象

4 UpdateModelMixin   更新数据对象

5 DestroyModelMixin   删除数据

例子

from rest_framework.generics import GenericAPIView
from .models import BookInfo
from .serializer import BookModelSerislzier
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin


class BooksView(GenericAPIView,ListModelMixin,CreateModelMixin,UpdateModelMixin):

    queryset = BookInfo.objects.all()#指定当前类视图使用的查询集数据
    serializer_class = BookModelSerislzier #指定类视图使用的序列化器类 注意后面没有括号 只是类名

    #查询多个
    def get(self,request):
        return self.list(request)
    
    # 保存
    def post(self,request):
        return self.create(request)
    #更新
    def put(self,request,pk):
        return self.update(request,pk)

 

七个拓展子类

视图作用方法父类
ListAPIView 查询多条数据 get GenericAPIView
ListModelMixin
CreateAPIView 新增一条数据 post GenericAPIView
CreateModelMixin
RetrieveAPIView 查询一条数据 get GenericAPIView
RetrieveModelMixin
UpdateAPIView 修改一条数据 put,patch GenericAPIView
UpdateModelMixin
DestroyAPIView 删除一条数据 delete GenericAPIView
DestroyModelMixin
RetrieveUpdateAPIView 查询,更新一条数据 get,put,patch GenericAPIView
RetrieveModelMixin UpdateModelMixin
RetrieveUpdateDestroyAPIView 获取,更新,删除一条数据 get,put,patch,delete GenericAPIView
RetrieveModelMixin UpdateModelMixin DestroyModelMixin

 例子

from rest_framework.generics import ListCreateAPIView
from .models import BookInfo
from .serializer import BookModelSerislzier


class BooksView(ListCreateAPIView):
    #查询多个 和新增数据
    queryset = BookInfo.objects.all()#指定当前类视图使用的查询集数据
    serializer_class = BookModelSerislzier #指定类视图使用的序列化器类 注意后面没有括号 只是类名

注意:查询一个数据 和多个数据的方法都是get 不要同时继承两个有同名方法不同功能的两个拓展子类 

可以创建两个视图类 分别继承不同含义的get

posted @ 2019-10-22 20:09  只会玩打野  阅读(165)  评论(0编辑  收藏  举报