首页 > 其他分享 >DRF进阶

DRF进阶

时间:2022-10-27 00:22:50浏览次数:63  
标签:进阶 self 配置 request rest framework data DRF

目录

DRF框架请求与响应

  • DRF 之Request

    Request是包装后的request,前面源码分析过了

    • 新包装的Request对象和原来django的request对象没有什么区别,使用方法一样,只是多了request.data,当然区别也不止这一点,我们看一下目录

    image

    • request常用方法

      • 新包装的Request对象是通过__getattr__方法反射过来的
        def __getattr__(self, attr):
            try:
                return getattr(self._request, attr)
            except AttributeError:
                return self.__getattribute__(attr)
        
      • 现在数据都可以通过request.data获取
        @property
        def data(self):
            if not _hasattr(self, '_full_data'):
                self._load_data_and_files()
            return self._full_data
        
      • 原来request请求提交的数据在GET里,现在请求参数可以通过request.query_parmas来查询参数,也是被伪装成数据属性了,本质还是使用了原来request对象的GET,所以请求参数既可以从GET中取,也可以从request.query_params中取
        @property
        def query_params(self):
            """
            More semantically correct name for request.GET.
            """
            return self._request.GET
        
    • 配置请求数据格式

      默认的情况下,三种数据格式(urlencoded,formdata,json)都可以解析
      比如当请求(post)过来要新增一条数据,那么我们可以针对该请求的数据格式做要求,比如只能提交json格式,或者允许From-data和json等···通过写接口实现,需要进行局部(views)或者全局配置(settings)

      • 配置处理顺序
        • 局部优先
        • 全局其次
        • 默认配置最后
      • 局部配置
        • 导入:from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
        • 配置参数:parser_classes

          配置在视图类里

          '''views.py'''
          # 作者详情视图类
          from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
          class AuthorDetailView(APIView):
          
          # 只处理json格式,默认三种格式都可以
              # parser_classes = [JSONParser, FormParser, MultiPartParser]
              parser_classes = [JSONParser]
              def post(self, request):
                  # 获取反序列化数据
                  ser = serializer.AuthorDetailSerializer(data=request.data)
                  if ser.is_valid():
                      # 校验通过存入数据库,不需要重写create方法了
                      ser.save()
                      return Response({'code': 100, 'msg': '新增成功', 'data': ser.data})
                  # 校验失败
                  return Response({'code': 101, 'msg': '校验未通过', 'error': ser.errors})
          
          image
          image
          image

          在局部配置的时候千万注意,如果parser_classes=[],那么什么数据格式都不解析

      • 全局配置
        • 导入:from rest_framework import settings
        • 源码解释
          '''Settings for REST framework are all namespaced in the REST_FRAMEWORK setting.
          For example your project's `settings.py` file might look like this:
          
          REST_FRAMEWORK = {
              'DEFAULT_RENDERER_CLASSES': [
                  'rest_framework.renderers.JSONRenderer',
                  'rest_framework.renderers.TemplateHTMLRenderer',
              ],
              'DEFAULT_PARSER_CLASSES': [
                  'rest_framework.parsers.JSONParser',
                  'rest_framework.parsers.FormParser',
                  'rest_framework.parsers.MultiPartParser',
              ],
          }
          '''
          
        • 全局settings.py配置
          from rest_framework import settings
          
          REST_FRAMEWORK = {
          'DEFAULT_PARSER_CLASSES': [
                  'rest_framework.parsers.JSONParser',
                  'rest_framework.parsers.FormParser',
                  'rest_framework.parsers.MultiPartParser',
              ],
          }
          
          '''默认是三种数据格式都解析的,想解析哪种写哪种就行了'''
          

          一般使用默认配置就可以了,如果需要搭配配置,局部和全局也可以一起使用

  • DRf 之 Response

    • Reponse常用参数

    • 局部配置

    • 全局配置

标签:进阶,self,配置,request,rest,framework,data,DRF
From: https://www.cnblogs.com/al6nlee/p/16830642.html

相关文章