捕获 Django 异常时返回 JSON 错误?

Tre*_*ent 5 django json exception-handling

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

类 ExceptionUserErrorMessageMiddleware(object):
    def process_exception(自我,请求,异常):
        """ 如果异常包含与用户相关的信息,则 
        将其粘贴到请求对象上"""

        theFormat = djrequest.get_getvar(request, settings.FORMAT_PARAM, "")
        msg = getMessage(异常)
        如果消息:
            setattr(请求,USER_ERROR_MESSAGE_ATTR,味精)

        如果格式==“json”:
            打印“做某事”

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

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

M S*_*lle 5

我们在我们的项目 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; 字符集=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)
Run Code Online (Sandbox Code Playgroud)