Django Rest框架异常处理程序的位置

时间:2018-11-12 06:52:08

标签: python django django-rest-framework

DRF文档说,一旦设置了异常处理程序,就需要在 settings.py 中对其进行定义,如下所示:

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

我的Django项目布局如下:

backend
    settings.py
    connectivity_service
        utils
            Custom404ErrorMessage.py

该项目称为后端,应用程序名称为Connectivity_service。Custom404ErrorMessage.py文件包含用于处理异常的功能 custom_exception_handler

我的settings.py看起来像这样:

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'backend.connectivity_service.utils.Custom404ErrorMessage'
}

但是,这会给我以下错误消息:

ImportError: Could not import 'backend.connectivity_service.utils.Custom404ErrorMessage' 
for API setting 'EXCEPTION_HANDLER'. ModuleNotFoundError: No module named 
'backend.connectivity_service'.

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

我的猜测是,当您从DRF example转换为代码时,您会混淆文本。文档状态:

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first,
# to get the standard error response.
response = exception_handler(exc, context)

# Now add the HTTP status code to the response.
if response is not None:
    response.data['status_code'] = response.status_code

return response

然后告诉您将其添加到您的设置中,如下所示:

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

请记住,上面的示例具有以下文件夹结构:

my_project> my_app> utils> custom_exception_handler

翻译为:

my_project_FOLDER> my_app_FOLDER> utils.PY> NAME_OF_DEFINED_FUNCTION_THAT_HANDLES_EXCEPTIONS

这就是我认为您可能会感到困惑的方式。因此,您在 utils_FOLDER 中有Custom404ErrorMessage.py,并试图导入它而不是定义的函数本身。当然,除非Custom404ErrorMessage.py是一个类,但是我对此表示怀疑,因为您似乎正在遵循使用函数的链接DRF示例。

我假设您的 Custom404ErrorMessage.py 具有以下内容:

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
....

因此,对于您的设置,您的 settings.py 如下所示:

REST_FRAMEWORK = {
 'EXCEPTION_HANDLER': 'backend.connectivity_service.utils.Custom404ErrorMessage.custom_exception_handler'
 }

看看最后一部分是定义的函数吗?希望有帮助!

答案 1 :(得分:1)

我也遇到了这个问题,您需要做的是解决这个问题:

  1. 在您的应用文件夹中创建utils.py
  2. 在其中定义您的custom_exception_handler函数
  3. 在您的设置文件中添加此“'EXCEPTION_HANDLER':'my_app.utils.custom_exception_handler'“,无需键入my_project