首页 > 其他分享 >drf之请求与响应、drf之视图组件、2个视图基类

drf之请求与响应、drf之视图组件、2个视图基类

时间:2022-09-29 15:23:05浏览次数:50  
标签:return ser self request 视图 基类 data Response drf

drf之请求与响应

Request和Response类

继承APIView后,请求对象:request,每一次请求都是一个新的request

Request类:属性或方法
    data:POST、PUT、PATCH请求方式解析后的数据
        原生django,put提交的数据在request.POST中是取不到的,将它转换为以json格式的字符串存放在了body中再取出来
    query_params
        其他的用起来跟之前一样(FILES、method、path...)底层原理 __getattr__

Response类:
    data = None,字典、列表序列化成json格式字符串,返回给前端(放在了http响应的body中了)
    status = None,http的响应的状态码,默认是200,201(创建成功)
        drf 帮我们把所有的Http响应状态码都做成了常量,可以直接导进来用
    headers = None,http的响应头,字典
        原生的django要在响应头中加数据
        res=JsonResponse(d)
        res['rrr'] = 'yyyy'
        return res
    template_name = None,在浏览器中看到好看的页面,指定的模板
    content_type = None,响应的编码格式(json)

drf能够解析的请求编码,响应编码

能够解析的请求编码

默认能够解析:urlencoded、form-data、json

其实通过配置完成:项目没有配置,是在drf内置的配置文件中提前好了

drf也是有俩套的:
    一套是项目中得配置(settings.py),一套是默认的配置
    drf的配置文件settings.py中有DEFAULT_PARSER_CLASSES(默认的解析类)
        -'rest_framework.parsers.JSONParser', 可以解析json格式
        -'rest_framework.parsers.FormParser', 可以解析urlencoded格式
        -'rest_framework.parsers.MultiPartParser' 可以解析form-data格式

想让我们的接口只能接受json格式

方式一:全局配置---》项目配置文件---》以后所有的接口都遵循这个配置
REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            # 'rest_framework.parsers.FormParser',
            # 'rest_framework.parsers.MultiPartParser',
        ],
    }
方式二:局部配置
class TestView(APIView):
    parser_classes = [JSONParser,FormParser,MultiPartParser]

总结

解析类的使用顺序:优先用视图类自己的,然后用项目配置文件,最后用内置的
实际项目如何配置:
    -基本上都运行JSONParser,FormParser
    -如果上传文件只允许MultiPartParser

响应编码

如果用浏览器,好看的样子,如果用postman看到的json格式
    默认情况下,响应的编码是根据客户端类型决定的

全局配置:在项目的配置文件
REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            # 'rest_framework.renderers.JSONRenderer', # json格式
            'rest_framework.renderers.BrowsableAPIRenderer', #浏览器的格式
        ]
    }

局部配置
class TestView(APIView):
    renderer_classes = [JSONRenderer,]

drf之视图组件

由于drf提供了一个顶层的视图类APIView,我们可以通过继承APIView写视图类

后期我们要写的代码可能重复代码比较多,就可以使用面向对象的继承,封装

2个视图基类

# APIView

# GenericAPIView-->继承了APIView
	-类属性:
    	queryset = User.objects.all()
    	serializer_class = UserSerializer
    -方法:
    	 self.get_object() # 根据pk获取单个数据
         self.get_serializer # 获取要使用的序列化类
         self.get_queryset() # 获取所有要序列化数据

基于APIView写5个接口

class UserView(APIView):
    def get(self, request):
        book_list = User.objects.all()
        ser = UserSerializer(instance=book_list, many=True)
        return Response(ser.data)

    def post(self, request):
        ser = UserSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': "新增成功"}, status=201)
        else:
            return Response({'code': 101, 'msg': ser.errors})


class UserDetailView(APIView):
    def get(self, request, pk):
        book = User.objects.filter(pk=pk).first()
        ser = UserSerializer(instance=book)
        return Response(ser.data)

    def put(self, request, pk):
        book = User.objects.filter(pk=pk).first()
        ser = UserSerializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': "修改成功"}, status=201)
        else:
            return Response({'code': 101, 'msg': ser.errors})

    def delete(self, request, pk):
        User.objects.filter(pk=pk).delete()
        return Response('')

基于GenericAPIView写5个接口

from rest_framework.generics import GenericAPIView
class UserView(GenericAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_list, many=True)
        return Response(ser.data)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': "新增成功"}, status=201)
        else:
            return Response({'code': 101, 'msg': ser.errors})


class UserDetailView(GenericAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)

    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': "修改成功"}, status=201)
        else:
            return Response({'code': 101, 'msg': ser.errors})

    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('')

标签:return,ser,self,request,视图,基类,data,Response,drf
From: https://www.cnblogs.com/zxr1002/p/16741681.html

相关文章

  • Oracle 12C R2-新特性---实时物化视图
    文字部分基本上都是官方文档翻译过来的,不准确的地方请谅解。物化视图可用于查询重写,即使它们并不完全与基表同步,并且被认为失效。使用物化视图日志与增量计算以及陈旧的物......
  • 了解视图dm_os_performance_counters的cntr_type含义
    dm_os_performance_counters说明该视图用于查看数据库的性能指标,但是不同的指标类型(cntr_type)计算方法有所不同。大概有以下不同类型:selectobject_name,counter_name,ins......
  • Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet
    SpringMVC使用细节第一节视图解析器通过HelloWorld程序我们看到了handler方法的返回值表示:请求处理完成后,请SpringMVC执行一个请求转发。转发的地址就是handler方法的......
  • 20. NumPy副本和视图
    1.前言对NumPy数组执行些函数操作时,其中一部分函数会返回数组的副本,而另一部分函数则返回数组的视图。本节对数组的副本和视图做重点讲解。其实从内存角度来说,副本就是......
  • drf之模型类序列化器ModelSerialize
    序列化常用字段charFieldBooleanFieldIntegerFieldDecimaField#ListField:{name:'summer',hobby:[1,2,3,4]}#DictField:{nane:'summer',wife:{'name':'哈哈哈'}}......
  • drf序列化类
    目录序列化类常用字段类和字段参数1.常用字段2.常用字段参数2.1.给CharField字段类使用的参数2.2.给IntegerField字段类使用的参数2.3.通用参数2.4.重点序列化类高级用法之......
  • drf ModelSerializer模型类序列化器
    序列化类的常用字段类和字段类参数 序列化类的常用字段类和字段类参数序列化类的字段类字段名=serializers.字段类型(字段参数)主要的字段类CharFieldBoolean......
  • drf之序列化类
     一、序列化类的常见字段类和常见参数1.1常见的字段类字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()CharFieldChar......
  • drf学习笔记
    今日内容概要序列化类常用字段类和字段参数序列化类高级用法之source序列化类高级用法之定制序列化字段的两种方式反序列化之数据校验模型类序列化器的使用反序列化......
  • 定时任务基类
    packagecom.bessky.common.task;importcn.hutool.core.collection.CollUtil;importcn.hutool.core.map.MapUtil;importcn.hutool.core.thread.ThreadUtil;import......