drf之请求与响应

1 drf之请求与响应

1.1 Resquest和Response类

#继承APIview后,请求对象:request--->每一次请求都是一个新的request
# Request类:属性或方法
    -data:POST、PUT、PATCH请求方式解析后的数据
        原生django.put提交的数据在request.POST中是取不到的
    -quest_params
    -其他的用起来跟之前一样用(FILES,method,path...)--->底层原理 __getatter__
# Response类
    data = None, #字典,列表--->序列化成json格式字符串,返回给前端(放在http响应的body中)
    status = None, # http 响应的状态码,默认是200,201 
        -drf帮咱们把所有的http响应状态码都做成了常量,可以直接使用
    headers = None, # http的响应头,字典
        -原生django要在响应头中加数据
            res = Jsonspanse(d)
            res['aaa'] = 'bbb'
            return res

# Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。

1.2 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,]
    
# 实际编码中,响应一般步配,就用默认

2 drf之视图组件

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

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

    

3 2个视图基类

# APIView
    APIView是REST framework提供的所有视图的基类,继承自Django的View父类。
	
# APIView与View的不同之处在于:
    传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
    视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
    任何APIException异常都会被捕获到,并且处理成合适的响应信息;
    在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
	
# GenericAPIView-->继承了APIView
    -类属性:
        queryset = User.objects.all()
        serializer_class = UserSerializer
    -方法:
        self.get_object()   # 根据pk获取单个数据
        self.get_serializer # 获取要使用的序列化类
        self.get_queryset() # 获取所有要序列化数据

3.1 基于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('')

3.2 基于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('')

__EOF__

本文作者夏の嵐
本文链接https://www.cnblogs.com/xzljm/p/16743151.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   夏之岚  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示