django-rest-framework http在django 1.5上以415失败

Nar*_*mma 32 django django-rest-framework

我正在使用REST API的django-rest-framework(最新版),并使用内置的测试客户端在django中实现了很少的测试用例.

以下django测试用例与django版本<1.5一起工作正常

self.client.put('/core/accounts/%s/'% self.account.id,
        data = prepare_dict(self.account),
        HTTP_AUTHORIZATION=self.token)
Run Code Online (Sandbox Code Playgroud)

升级到django 1.5,除了与HTTP PUT相关的测试外,所有测试都在通过, 同时调查发现的问题@ https://docs.djangoproject.com/en/dev/releases/1.5/#options-put-and-delete-请求合的测试客户端

如果在没有content_type的PUT请求中使用data参数,则必须先对数据进行编码,然后再将其传递给测试客户端并设置content_type参数.

因此,更新了我的测试以反映此更改并尝试了以下,但仍然获得http 415而不是http 200

from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
self.client.put('/core/accounts/%s/'% self.account.id,
            data = encode_multipart(BOUNDARY, prepare_dict(self.account)),
                content_type=MULTIPART_CONTENT,
        HTTP_AUTHORIZATION=self.token)
Run Code Online (Sandbox Code Playgroud)

知道我错过了什么吗?PS:django-rest-framework内置Web UI的所有功能都运行良好

Tom*_*tie 39

你绝对是在正确的轨道上 - 在这种情况下的突破性测试肯定是由于Django改变PUT了测试客户端的行为.

你修复看起来我的权利了.415是"不支持的媒体类型"响应,这意味着请求内容类型不是由为视图配置的任何解析器可以处理的内容.

通常在这种情况下,这是由于忘记设置请求的内容类型,但看起来你已经正确设置为 multipart/form-data; boundary=...

要仔细检查的事情:

  • 究竟什么response.data显示为错误详细信息?
  • 您在DEFAULT_PARSER_CLASSES设置中配置了什么,如果您有一个,或者您在视图属性上设置了parser_classes什么?
  • 确保content_type测试中没有拼写错误(尽管这里是正确的).

编辑:

感谢您的评论 - 这清除了一切.您只安装了JSON解析器,但是您尝试发送Form编码数据.你应该:

  • 添加FormParserMultiPartParser您的设置/查看,所以它支持的形式编码.(另请注意,默认DEFAULT_PARSER_CLASSES设置确实包含它们,因此如果您没有设置任何内容,它将按预期工作)

要么

  • 在您的测试用例中使用json编码对代码进行编码,而不是表单编码data=json.dumps(prepare_dict(self.account)), content_type='application/json'.

  • 是的,我应该将您的答案标记为正确。但为了记录起见,这里是我出错的地方。直到现在我认为, settings.DEFAULT_PARSER_CLASSES 是在没有找到任何东西时设置默认解析器。现在我意识到,它应该包含您想要使用的所有可能的解析器。因为它使用这些设置作为最终列表(如果可用)。现在我将 JSON/Form/Multipart 设置为默认值,一切都很好。谢谢。默认有多种含义:) (2认同)
  • 我在DRF 3.3上遇到过这个问题,因为我使用的是`django.test.TestCase`而不是`rest_framework.test.APITestCase`.一旦我做出改变,问题就消失了. (2认同)

Tob*_*nst 9

出现 415 错误,因为我使用了 的实例django.test import Client而不是rest_framework.test import APIClient. APIClient将以正确的方式自动对数据进行编码。

纯json请求:

client = APIClient()
client.post(url, format='json', data=json, headers=headers)
client.put(url, format='json', data=json, headers=headers)
Run Code Online (Sandbox Code Playgroud)

创建/更新包括文件:

client = APIClient()
client.post(url, format='multipart', data=data, headers=headers)
client.put(url, format='multipart', data=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)

我在这个 415 错误上花了很多时间,所以我希望这对其他人有帮助。