【问题标题】:Difference between content_type=application/json and format=json in DRF APIClientDRF APIClient 中 content_type=application/json 和 format=json 的区别
【发布时间】:2021-10-02 07:21:29
【问题描述】:

我在我的项目中使用rest_framework.test.APIClient 进行单元测试。我使用字典作为请求数据,所以 None 值没有正确解析,因为它不理解格式。我将format="json" 作为参数添加到client.post(),它运行良好。但是添加content_type="application/json" 也解决了这个问题,我想知道有什么区别。

【问题讨论】:

    标签: json django django-rest-framework


    【解决方案1】:

    rest 框架中的 APIClient 扩展自 django 应用程序中的测试客户端,并使用 APIRequestFactory 添加了额外的功能来处理每种类型的请求,例如获取、发布等。django 测试客户端接受content_type,其余框架APIClient 接受formatcontent_type。但是,您不能在APIClient 中同时设置两者,因为它会引发错误。

    让我们看看这两种情况:

    • 使用content_type='application/json'

      在这种情况下,content_type 按原样传递给 django 测试客户端,如果数据是 dictlisttuple 之一,它会使用 json 模块转储数据.

    • 使用format=json

      rest_framework 有一个设置TEST_REQUEST_RENDERER_CLASSES,它为不同类型的数据定义了不同的渲染器。

      'TEST_REQUEST_RENDERER_CLASSES': [
          'rest_framework.renderers.MultiPartRenderer',
          'rest_framework.renderers.JSONRenderer'
      ],
      

      从这些渲染器中,APIRequestFactory 创建指定格式之间的映射作为键。在请求中发送format='json' 时,它会查找渲染器并匹配JSONRenderer。然后它尝试使用这个特定的渲染器对给定的数据进行编码。这个渲染器还指定了media_type,它等于application/json,并设置为content_type,编码数据和content_type都被传递给django测试客户端。因为现在编码的数据是一个字符串,即使传递content_type也不会转储两次。

    【讨论】:

    • 哇,很好的答案。现在我知道传递format='json'时某些嵌套数据没有正确解析的原因@
    猜你喜欢
    • 2017-01-21
    • 2019-12-02
    • 2015-08-18
    • 2012-04-09
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2012-07-18
    • 2012-11-27
    相关资源
    最近更新 更多