【问题标题】:Django Rest Framework: How to use EXCEPTION_HANDLER with DEBUG = True?Django Rest Framework:如何在 DEBUG = True 的情况下使用 EXCEPTION_HANDLER?
【发布时间】:2021-07-08 09:05:06
【问题描述】:

我正在为我的 REST API 使用自定义异常处理程序,该处理程序以我的前端知道如何处理的 JSON 数据进行响应。问题是设置DEBUG = True,Django 不使用我的自定义异常处理程序。相反,它使用标准的 HTML 调试页面进行响应,如下所示:

这是我的settings.py

DEBUG = True

REST_FRAMEWORK = {
   # This doesn't seem to do anything when DEBUG == True
   'EXCEPTION_HANDLER': 'stripe_app.utils.custom_exception_handler'
}
...

我知道我可以只设置DEBUG = False,但如果我这样做了,我还必须更改许多其他使用DEBUG 变量的东西。

那么,如何将自定义异常处理程序与 DEBUG = True 设置一起使用?

我已经在 DRF 文档中寻找答案: https://www.django-rest-framework.org/api-guide/settings/#exception_handler

和 Django 文档: https://docs.djangoproject.com/en/3.1/ref/settings/#debug

但我找不到我正在寻找的答案。

编辑

我刚刚意识到我忘记在我的根 urls.py 中设置以下内容,每个 DRF docs

handler400 = 'stripe_app.views.bad_request'
handler500 = 'stripe_app.views.server_error'

但是,DEBUG = True 仍然会导致问题。例如,即使我创建了这样的视图:

def always_raise_exception(request):
    raise Exception

如果DEBUG == True,上面的视图响应标准的Django HTML调试页面。

如果DEBUG == False,它会(正确地)响应一个JSON响应(另一个编辑:我认为这只是因为服务器服务器引发了与DEBUG = True不同的异常)。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您确定DEBUG=False 正在使用异常处理程序吗?

    来自documentation

    请注意,异常处理程序只会被引发的异常生成的响应调用。它不会用于视图直接返回的任何响应,例如当序列化验证失败时通用视图返回的 HTTP_400_BAD_REQUEST 响应。

    从您的示例中,我猜您没有明确提出 404,因此避免了异常处理程序。

    【讨论】:

    • 我认为你是对的。在settings.py 中设置EXCEPTION_HANDLER 仍然可以为我提供格式正确的验证错误响应。我希望我能找到一种简单的方法来以某种方式格式化 all 我的错误响应。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2012-06-05
    • 2020-09-26
    • 2018-02-04
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多