首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django -rest框架http put失败415在django 1.5上

django -rest框架http put失败415在django 1.5上
EN

Stack Overflow用户
提问于 2013-03-01 07:57:45
回答 3查看 21.5K关注 0票数 45

对于REST,我使用django -REST框架(最新版本),并且在django中使用内置的测试客户端实现了很少的测试用例。

以下django测试用例运行良好,django版本< 1.5

代码语言:javascript
运行
复制
self.client.put('/core/accounts/%s/'% self.account.id,
        data = prepare_dict(self.account),
        HTTP_AUTHORIZATION=self.token)

升级到django 1.5,除了与HTTP 相关的测试之外,所有测试都通过了,同时查看问题时发现了这个@ https://docs.djangoproject.com/en/dev/releases/1.5/#options-put-and-delete-requests-in-the-test-client

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

因此,更新了我的测试以反映此更改,并尝试了以下操作,但仍然使用http 415而不是http 200。

代码语言:javascript
运行
复制
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)

知道我错过了什么吗?P.S:从django-rest框架内置的web UI中,所有功能都运行良好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-01 09:13:06

您绝对是在正确的轨道上--这种情况下的破坏测试肯定是因为Django在测试客户端的PUT行为中发生了变化。

你的做法在我看来也是对的。415是“不支持的媒体类型”响应,这意味着请求内容类型不能由为视图配置的任何解析器处理。

通常情况下,这可能是因为忘记设置请求的内容类型,但看起来您已经将其正确设置为multipart/form-data; boundary=...

需要反复检查的东西:

  • response.data究竟显示了什么作为错误细节?
  • 如果您有DEFAULT_PARSER_CLASSES设置,那么您在视图设置中配置了什么?如果有,那么在视图属性parser_classes上设置了什么?
  • 确保测试中没有content_type中的错误(尽管这里是正确的)。

编辑

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

  • FormParserMultiPartParser添加到您的设置/视图中,以便它支持表单编码。(还请注意,默认的DEFAULT_PARSER_CLASSES设置确实包括它们,所以如果您根本没有设置任何内容,它就会像预期的那样工作)

  • 使用json编码来编码请求,而不是表单编码.测试用例中的data=json.dumps(prepare_dict(self.account)), content_type='application/json'
票数 51
EN

Stack Overflow用户

发布于 2019-11-29 22:52:48

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

纯json请求:

代码语言:javascript
运行
复制
client = APIClient()
client.post(url, format='json', data=json, headers=headers)
client.put(url, format='json', data=json, headers=headers)

创建/更新包括文件:

代码语言:javascript
运行
复制
client = APIClient()
client.post(url, format='multipart', data=data, headers=headers)
client.put(url, format='multipart', data=data, headers=headers)

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

票数 9
EN

Stack Overflow用户

发布于 2022-01-18 01:51:36

在Django REST框架上使用JSON格式测试POST时,我得到了错误415。这就是我为修复它所做的:

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

代码语言:javascript
运行
复制
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ],
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
}

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

在测试文件中:

代码语言:javascript
运行
复制
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和包版本:

  • python 3.8.0
  • Django==3.0.6
  • djangorestframework==3.11.0

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15153048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档