【问题标题】:Returning JSON error when catching Django exception?捕获 Django 异常时返回 JSON 错误?
【发布时间】:2012-06-23 03:38:31
【问题描述】:

是否有人对让中间件捕获异常的最佳方式有意见,而不是将错误呈现到 HTML 模板中,而是返回 JSON 对象?目前我有下面的中间件来捕获异常,如果它可以找到额外的用户错误消息,则将其放在请求中(然后模板会选择)。

类 ExceptionUserErrorMessageMiddleware(对象): def process_exception(自我,请求,异常): """ 如果异常有与用户相关的信息,那么 将其附加到请求对象上""" theFormat = djrequest.get_getvar(request, settings.FORMAT_PARAM, "") msg = getMessage(异常) 如果味精: setattr(请求,USER_ERROR_MESSAGE_ATTR,味精) 如果格式 == “json”: 打印“做某事”

在这里返回 json 对象的最佳方式是什么?我应该设置任何额外的标题吗?

对于不通过中间件的特殊情况,有没有办法做同样的事情(我很确定 404 没有,还有其他方法吗)?

【问题讨论】:

    标签: django json exception-handling


    【解决方案1】:

    我们在 MapIt 项目上所做的 - https://github.com/mysociety/mapit - 正如你所说,这样做是为了向中间件引发异常,然后根据提供的格式直接返回 HTML 模板或 JSON 对象要求。您可以在https://github.com/mysociety/mapit/blob/master/mapit/middleware/view_error.py查看代码

    就附加标头而言,我们的 output_json 函数将响应中的 Content-Type 设置为 'application/json; charset=utf-8'。

    对于 404 情况,我们有自己的 get_object_or_404 函数,它包装了 get_object_or_404 并将 Django Http404 异常转换为我们自己的异常,然后如果适合请求,该异常将正确返回 JSON。

    from django.shortcuts import get_object_or_404 as orig_get_object_or_404
    
    def get_object_or_404(klass, format='json', *args, **kwargs):
        try:
            return orig_get_object_or_404(klass, *args, **kwargs)
        except http.Http404, e:
            raise ViewException(format, str(e), 404)
    

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 2015-06-11
      • 2012-06-09
      • 1970-01-01
      • 2014-03-21
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      相关资源
      最近更新 更多