44

我正在为 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)

升级到 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)

知道我错过了什么吗?PS:所有功能都可以从 django-rest-framework 内置 Web UI 正常工作

4

3 回答 3

51

您绝对走在正确的轨道上——在这种情况下,破坏性测试肯定是由于 DjangoPUT对测试客户端的行为发生了变化。

你的修复对我来说也很合适。415 是“不支持的媒体类型”响应,这意味着请求内容类型不是为视图配置的任何解析器都可以处理的内容。

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

需要仔细检查的事情:

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

编辑

感谢您的评论 - 这清除了一切。您只安装了 JSON 解析器,但您正在尝试发送表单编码数据。您应该:

  • FormParser将和添加MultiPartParser到您的设置/视图,以便它支持表单编码。(另请注意,默认DEFAULT_PARSER_CLASSES设置确实包含它们,因此如果您根本不设置任何内容,它将按预期工作)

或者

  • 在您的测试用例中使用json编码而不是表单编码对请求进行编码。data=json.dumps(prepare_dict(self.account)), content_type='application/json'
于 2013-03-01T09:13:06.847 回答
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)

创建/更新包括文件:

client = APIClient()
client.post(url, format='multipart', data=data, headers=headers)
client.put(url, format='multipart', data=data, headers=headers)

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

于 2019-11-29T22:52:48.380 回答
0

使用 JSON 格式在 Django REST Framework 上测试 POST 时出现错误 415。这是我为解决它所做的:

我将这些 Django REST Framework 设置添加到settings.py

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ],
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
}

https://www.django-rest-framework.org/api-guide/settings/

在测试文件中:

from rest_framework.test import RequestsClient
from django.test import TestCase


class MyTestCase(TestCase):

    def test_post(self):
        url = 'http://localhost:8000/api/'
        my_data = {'key_1': 1, 'key_2': 'a_string'}

        client = RequestsClient()

        response = client.post(url, json=my_data, 
                        headers={'content-type': 'application/json'})
        
        status_code = response.status_code
        data = response.json()

Python 和包版本:

  • 蟒蛇3.8.0
  • Django==3.0.6
  • djangorestframework==3.11.0

这不是问题的解决方案,但由于我经过一番搜索后来到这里,也许这可以帮助其他人。

于 2022-01-18T01:51:36.673 回答