首页 > 其他分享 >drf之试图基类

drf之试图基类

时间:2022-09-29 18:48:52浏览次数:57  
标签:试图 return ser get self request 基类 Response drf


一、请求与响应

# 现在我们在写视图类的时候都是继承了APIView
# 而APIView的request都变成了新的request了跟继承了View的request已经不一样了
# 所以每次请求都是一个新的request

#Request类的属性和方法
    -data: 中有POST,PUT,PATCH请求方式解析过后的数据
        -django原生的 put提交的数据 request.body中是提取不出来的
    -query_params: 就是GET请求
    其他的用法还是跟以前一样 文件数据还是在request.FILES中获取
    (method,path)也是一样的用法  ---》底层原理就是用来反射 getattr

# Response类
    Response中有这几个方法:
        data=None,   # 就是后端传给前端的数据 字典和列表---》序列化成json格式的字符串传个前端(数据放在了http响应的body中了)
        status=None,  # http的 响应状态码  默认是 200
             -drf帮我们把所有的响应状态码都做成了常量,我们可以直接导入使用  
                  from rest_framework.status import HTTP_200_OK
        headers=None,  # http的响应头, 字典{} 因为响应头就是一堆的K:V键值对
        template_name=None,   # 可以指定模板 这样就可以在浏览器中看到好看的页面
        content_type=None  # 响应的编码格式(json)    

# 我们还可以在响应头中添加数据
class GetView(GenericAPIView):
    def get(self, request):
        return Response(headers={'name': 'jason'})  # 直接在headers中使用字典添加
# 而原生django想要在响应头中添加数据需要这样写:
            res=JsonResponse(d)
            res['rrr'] = 'yyyy'
            return res

二、drf能够解析的请求编码,想要编码

1.请求编码

# 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',
                ],
            }
# 不想用哪个解析格式 那么只需要把这个解析格式注释即可

# -方式二:局部配置
    from rest_framework.parsers import JSONParser, MultiPartParser, FormParser
    class BookView(APIView):
        parser_classes = [JSONParser, ]

# 总结
    解析类的使用顺序 ---》会先找本身视图类的 ---》再找项目的配置文件 ---》最后找drf的配置文件
     -实际项目如何配置
        -基本上都运行JSONParser,FormParser
        -如果上传文件只允许MultiPartParser

2.响应编码

# 如果用浏览器 那么就是好看的页面  如果使用postman那么就是json格式
    -默认情况下,响应的编码格式是根据客户端类型决定的

# drf有默认配好了 响应的编码格式

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

# 局部配置
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookView(APIView):
    renderer_classes = [JSONRenderer, BrowsableAPIRenderer]

# 使用顺序: 视图类---》项目的配置文件 ---》drf的配置文件

三、两个试图基类

# APIView

# GenericAPIView  ---》 其实也是继承了APIView了

# 类属性
    queryset = User.objects.all()
    serializer_class = BookSerializer
# 方法:
    self.get_queryset()  # 获取所有需要序列化的数据
    self.get_objects()    # 根据pk获取单个数据
    self.get_serializer()  # 获取要使用的序列化类

3.1基于APIView写五个接口

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('')


# 我们会发现代码有点冗余了

3.2使用GenericApiView写五个接口

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('')

# 这个时候我们写单表的五个接口其实都是差不多的 所以我们如果还要写其他表的五个接口 那么我们只需要把下面的参数该了即可 后面的五个接口都不需要动了
    queryset = User.objects.all()
    serializer_class = UserSerializer

 

标签:试图,return,ser,get,self,request,基类,Response,drf
From: https://www.cnblogs.com/stephenwzh/p/16742598.html

相关文章

  • drf之请求与响应,drf之视图组件,2个视图基类
    1.drf之请求与响应在继承drf中的APIView时Request它的请求对象request就不是原来的那个request了(具体去看APIView源码分析),所以没钱请求的request都是一个新的对象,这......
  • drf之请求与响应、drf之视图组件、2个视图基类
    drf之请求与响应Request和Response类继承APIView后,请求对象:request,每一次请求都是一个新的requestRequest类:属性或方法data:POST、PUT、PATCH请求方式解析后的数据......
  • 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......
  • drf-02
    APIViewAPIView基本使用 1.drf:第三方app 2.cbv的视图类:继承APIView类及其子类 3.基于View与JsonResponse的视图类 4.继承APIView+drf+Response的视图类(drf是app......
  • drf 反序列化报错
    解决思路:检查下自定义的序列化类是否有无重写。......