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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/xzljm/p/16743151.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!