Django-rest-framework: `data=None` 时 JSONRenderer 不返回有效的 json 响应

创建于 2018-06-13  ·  4评论  ·  资料来源: encode/django-rest-framework

重现步骤

@permission_classes((AllowAny, ))
class Viewset(viewsets.ViewSet):
    renderer_classes = (JSONRenderer, )
    def list(self, request, *args, **kwargs):
        return Response()

预期行为

有效的 json 响应正文,例如null{}

实际行为

没有设置Content-Type标头并返回空响应 - 在使用 jquery 的ajax()发出请求时尤其痛苦。 它抛出一个 parseerror 并拒绝一个空主体的成功响应的承诺。 见这里https://stackoverflow.com/a/6186905

公关在这里: https :

最有用的评论

看起来Content-Type标头在空渲染器响应中被删除(第 80 行)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

所有4条评论

只是一个快速的澄清.. 我可能不会重新创建您的确切设置,但快速的手动测试表明Content-Type标头已正确设置为application/json

至于空洞的回应,我倾向于同意@kltdwrds。 我不知道规范是否允许空正文,但是,JavaScript 的JSON.parse和 Python 的json.loads无法解码空字符串。

也就是说, data=None应该被编码为null


再想一想,当前的行为是有道理的。 尽管JSON.parsejson.loads确实失败了,但客户端有责任在解析之前检查内容类型。 如果有的话,这是 jQuery 中的一个错误。

嗯我正在使用

from rest_framework import viewsets
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response

不确定Content-Type标头的设置位置,但我刚刚使用上面的示例确认它从响应中丢失。

看起来Content-Type标头在空渲染器响应中被删除(第 80 行)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

我们当前对return Response()是有意的。 虽然返回null也是有效的,但更典型的情况是我们需要一种方法来返回没有内容类型的空响应。 我可能宁愿我们暂时保持现状。

此页面是否有帮助?
0 / 5 - 0 等级