• 五十六、请求与响应


    一 Request类

    经过REST framework传入视图函数的request已经不是原来的request,而是Request的类产生的对象request。

    REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。

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

    1.1 常用参数

    • data
      POST、PUT、PATCH请求方式解析后的数据。(原生django的PUT请求在request.POST中取不到。)

    • query_params
      与原生的GET一样。

    • 其他的方法和原来的request使用方法一致:
      底层原理:在Request实例化对象时,self._request = request,将原来的request对象给了Request的对象,又在Request类中定义了__getattr__魔法方法,当在视图函数中获取request对象的属性和方法时,找不到会触发魔法方法的执行,利用反射获取原来的request对象中的方法。

          def __getattr__(self, attr):
              """
              If an attribute does not exist on this instance, then we also attempt
              to proxy it to the underlying HttpRequest object.
              """
              try:
                  return getattr(self._request, attr)
              except AttributeError:
                  return self.__getattribute__(attr)
      '
      运行

    二 Response类

    实例化参数

    • data(列表或者字典,序列化成json字符串返回给前端)
    • status(响应状态码,默认是200:from rest_framework.status import HTTP_200_OK)
    • headers (响应头,以字典的形式返回给前端)
    • content_type (响应的编码格式)
    • template_name (指定模板)
      class Test(APIView):
      def get(self, request):
          return Response(data={}, status=status.HTTP_201_CREATED, headers={'name': 'jasper'})
      

    在这里插入图片描述

    三 请求编码与响应编码

    3.1 能够解析的请求编码

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

    其实是通过配置文件配置的,在rest_framework包下的settings.py中。

    DEFAULTS = {
        # Base API policies
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 可以解析json格式
            'rest_framework.parsers.FormParser',  # 可以解析urlencoded格式
            'rest_framework.parsers.MultiPartParser'  # 可以解析form-data格式
        ],
    

    想在项目中配置REST_FRAMEWORK,需要像下边这样在项目配置文件中配置。

    """
    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中配置REST_FRAMEWORK。

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            # 'rest_framework.parsers.FormParser',
            # 'rest_framework.parsers.MultiPartParser',
        ],
    }
    '
    运行

    方式二:
    在视图类中定义parser_classes属性。

    class Test(APIView):
        from rest_framework.parsers import JSONParser, MultiPartParser, FormParser
        parser_classes = [JSONParser]
    
        def post(self, request):
            return Response(request.data)
    

    在这里插入图片描述

    总结:解析类的执行顺序,先执行视图类自己的,在执行项目配置文件中的,最后执行rest_framework里的配置文件。

    3.2 响应编码

    默认情况下,相应编码是根据客户端的类型而定的,浏览器访问的话相应编码就是text/html,postman的相应编码是application/json。

    配置相应编码格式也是两种方式

    方式一:配置文件中配置

    'DEFAULT_RENDERER_CLASSES': [
         'rest_framework.renderers.JSONRenderer',  # 只能相应json格式数据
         # 'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览器格式
     ],
    

    方式二:在视图类中配置

    from rest_framework.renderers import JSONRenderer, BaseRenderer
    renderer_classes = [BaseRenderer]
    
  • 相关阅读:
    抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。
    前端知识5-jQuery
    matlab 优化问题
    前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体
    计算机网络——传输层
    学术加油站|面向HTAP数据库的基准评测工具研究进展
    世间的万事万物,总会有许多奇迹的发生。所以我相信,平行线也终会有交汇的那一瞬间,
    35. 搜索插入位置、Leetcode的Python实现
    【矩阵分析】求 史密斯标准形,求不变因子 (利用初等变换求 不变因子,史密斯标准形) || 行列式因子 || 利用 行列式因子 求史密斯标准形
    【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路
  • 原文地址:https://blog.csdn.net/weixin_68531269/article/details/127106892