我有Django视图,该视图返回内容类型为'application / json'的HTTPResponse。在测试中,我想验证是否设置了预期的内容类型。
从docs中,我看到我可以传递的content_type HTTPResponse有一个参数,而不是将其作为属性。为什么会这样?
在我的views.py
中,我构建并发送如下的HTTPResponse:
j = json.dumps(j)
return HttpResponse(j, content_type='application/json')
在我的tests.py
中,我想做类似的事情
self.assertEqual(response.content_type, 'application/json')
但是在HTTPResponse对象上没有该属性,该问题当然会因AttributeError: 'HttpResponse' object has no attribute 'content_type'
如何在Django中获取响应的内容类型?对HTTP的运作方式有误解吗?
答案 0 :(得分:0)
事实证明,Django中的HTTPResponse对象具有_content_type_for_repr
属性。
这是(对我来说)包含的内容:
print(response._content_type_for_repr)
, "application/json"
我不知道为什么采用这种格式,但是将其切成薄片让我可以找到想要的位置:
self.assertEqual(response._content_type_for_repr[3:-1], 'application/json')
(如果有人对此有更好的解决方案,请不要犹豫将其发布!)
答案 1 :(得分:0)
您可以使用JsonResponse
:
from django.http import JsonResponse
return JsonResponse(j)
无需在content_type
中设置或测试json.dumps
和JsonResponse
。
答案 2 :(得分:0)
Django HttpResponse
的{{3}}提到:
HttpResponse.__getitem__(header)
返回给定标题名称的值。不区分大小写。
此MDN doc提到在HTTP响应中,内容类型是标题为Content-Type
的标头。
因此,以下代码返回Django HttpResponse
的内容类型:
response.__getitem__('Content-Type')
这可以在Django测试中用于断言Content Type具有某个值,例如断言HttpResponse
的Content Type为application/json
:
self.assertEqual(response.__getitem__('content-type'), 'application/json')
答案 3 :(得分:0)
最简单的方法是<select>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<button onclick="myFunction()">set</button>
<script>
function myFunction() {
var x = document.title;
}
</script>
,在您的情况下,它将返回response['content-type']
。因此,要测试您可以使用:
'application/json'