首页 > 解决方案 > Django Rest Framework:如何在 DEBUG = True 的情况下使用 EXCEPTION_HANDLER?

问题描述

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

这是 DEBUG = True 的默认响应

这是我的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 文档,我刚刚意识到我忘记在我的根目录中设置以下内容:

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 响应(另一个编辑:我认为这只是因为服务器服务器引发了与 with 不同的异常DEBUG = True)。

标签: djangodjango-rest-framework

解决方案


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

文档中:

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

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


推荐阅读