【问题标题】:Django shortcut get_object_or_404 inside Django Rest framework Class Based ViewsDjango Rest框架基于类的视图中的Django快捷方式get_object_or_404
【发布时间】:2019-04-08 12:49:36
【问题描述】:

当遇到异常时,Django 中的 get_object_or_404 快捷函数会给出一个非常漂亮的错误消息,格式如下:

'No %s matches the given query.' % queryset.model._meta.object_name)

但是,当在基于 DRF 3.X 类的视图中使用它时,最终的 404 响应数据有一个非常精简的版本,如下所示:

{"detail": "Not found."}

很明显,DRF 消息非常通用,没有关于模型名称的信息。我假设 DRF NotFound 异常类定义here 将消息剥离到当前的最低限度.

尽管在基于 DRF 类的视图中使用 Django,但我如何才能获得原始的漂亮错误消息?

【问题讨论】:

  • 我不这么认为。 DRF api 响应非常标准,当这些是错误时共享最少的消息应该没问题:)。

标签: python django django-rest-framework


【解决方案1】:

APIView 类的默认异常处理程序由get_exception_handler 方法决定。即,

def get_exception_handler(self):
    """
    Returns the exception handler that this view uses.
    """
    return self.settings.EXCEPTION_HANDLER

换句话说,APIView 类默认使用的处理函数是rest_framework.views.exception_handler(在default settings 上指定)。

根据 DRF 文档,

默认情况下,DRF 处理 REST 框架 APIException,并且 还有Django内置的Http404PermissionDenied例外。

由于在这种情况下您只想为 Http404 自定义错误消息,因此您可以像这样创建自己的处理程序。

即,

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 overide the error message.
    if response is not None and isinstance(exc, Http404):
        # set the custom message data on response object
        response.data['detail'] =  exc.args[0] # exc.args[0] will have the message text, 

    return response

然后将此自定义处理程序放入您的项目设置中。

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

注意:此解决方案未经测试。

【讨论】:

  • 当我在 settings.py 中指定处理程序时,我得到一个导入模块错误.. where 应该是我在其中编写异常处理程序的文件的位置?
  • @Amistad 你目前是如何设置EXCEPTION_HANDLER的?
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 2021-09-04
  • 2016-01-23
  • 2016-08-16
  • 2017-12-30
  • 2019-07-12
  • 2020-08-08
  • 2018-11-24
相关资源
最近更新 更多