6

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

类 ExceptionUserErrorMessageMiddleware(对象):
    def process_exception(自我,请求,异常):
        """ 如果异常有与用户相关的信息,那么
        将其附加到请求对象上"""

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

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

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

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

4

1 回答 1

6

我们在我们的项目 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)
于 2012-07-06T17:00:49.027 回答