我正在使用django rest framework(最新版本)for rest API,并使用内置测试客户端在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相关测试外,所有测试均通过

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

因此,更新了我的测试以反映此更改,并try 跟随,但仍然得到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)

知道我错过了什么吗? 附言:django-睡觉-框架内置的web UI中的所有功能都工作得很好

推荐答案

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

你的fix looks也适合我.415是"不受支持的媒体类型"响应,这意味着请求内容类型不能由为视图配置的任何解析器处理.

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

需要仔细判断的事项:

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

Edit:

谢谢你的 comments --这让一切都清楚了.您只安装了JSON解析器,但是您正在try 发送表单编码数据.您应该执行以下任一操作:

  • FormParserMultiPartParser添加到您的设置/视图中,以便它支持表单编码.(还要注意,默认的DEFAULT_PARSER_CLASSES设置does包括它们,因此如果您根本不设置任何内容,它将按预期工作)

Or

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

Django相关问答推荐

使用django直接计算geohash而不创建模型

模仿没有像预期的那样工作(Django)

自定义身份验证 django

如何在 Django 模板视图中显示我的数据?

组织大型 Django 元素的指南

在 django/python 上访问请求标头

从python中的URL获取查询字符串的最佳方法?

django - pisa:将图像添加到 PDF 输出

virtualenv(python3.4), pip install mysqlclient 错误

在 Django 中注册用户的最佳方法

如何从 django 的 db 模型中获取字段类型字符串

Celery 和 Django 简单示例

在 docker 容器中创建 django 超级用户而不输入密码

更改 Django ModelChoiceField 以显示用户的全名而不是用户名

Django:以 10 为底的 int() 的无效文字

刷新时重新提交的django表单

如何在 django 中捕获UNIQUE constraint failed404

找不到 msguniq.确保您安装了 GNU gettext 工具 0.15 或更新版本. (Django 1.8 和 OSX ElCapitan)

Django中GROUP BY中注释的聚合

如何在 django 模板中呈现有序字典?