【问题标题】:How to return HTTP 400 response in Django?如何在 Django 中返回 HTTP 400 响应?
【发布时间】:2014-06-22 21:46:48
【问题描述】:

如果请求 GET 数据无效且无法解析,我想从我的 django 视图函数返回 HTTP 400 响应。

我该怎么做?似乎没有像 404 那样对应的 Exception 类:

raise Http404

【问题讨论】:

标签: django python-2.7


【解决方案1】:

从 Django 3.2 开始,您还可以引发 BadRequest 异常:

from django.core.exceptions import BadRequest

raise BadRequest('Invalid request.')

在某些情况下,这可能比另一个答案中提到的SuspiciousOperation 更好,因为它不记录安全事件;见doc on exceptions

【讨论】:

    【解决方案2】:

    来自我之前的评论:

    您可以返回HttpResponseBadRequest

    另外,您可以创建一个像 Http404 这样的 Exception 子类来拥有自己的 Http400 异常。

    【讨论】:

    • 你能展示如何创建一个异常子类吗? Django BaseHandler 专门寻找 Http404 类型并且总是使用状态码 404,我看不到在其中连接你自己的异常和状态码的干净方法
    【解决方案3】:

    如果您使用的是 Django Rest Framework,则有两种方法可以在视图中引发 400 响应:

    from rest_framework.exceptions import ValidationError, ParseError
    
    raise ValidationError
    
    # or 
    raise ParseError
    

    【讨论】:

    • 您也可以使用raise ValidationError("some message") 来呈现响应数据。
    • 另外,如果您想引用特定字段:raise ValidationError({"some_field": "some error"})
    【解决方案4】:

    您可以执行以下操作:

    from django.core.exceptions import SuspiciousOperation
    raise SuspiciousOperation("Invalid request; see documentation for correct paramaters")
    

    SuspiciousOperation 映射到 https://github.com/django/django/blob/master/django/core/handlers/base.py 的第 207 行附近的 400 响应

    【讨论】:

    • 这个映射也列在documentation中。
    • SuspiciousOperation 和 400 都不在您链接到的代码中。我想它已经改变了。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 2020-01-21
    • 2020-06-16
    • 2019-06-25
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多