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

时间:2012-06-20 22:27:13

标签: django json exception-handling

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

class ExceptionUserErrorMessageMiddleware(object):
    def process_exception(self, request, exception):
        """ if the exception has information relevant to the user, then 
        tack that onto the request object"""

        theFormat = djrequest.get_getvar(request, settings.FORMAT_PARAM, "")
        msg = getMessage(exception)
        if msg:
            setattr(request, USER_ERROR_MESSAGE_ATTR, msg)

        if theFormat == "json":
            print "do something"

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

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

1 个答案:

答案 0 :(得分:4)

我们在项目MapIt上做了什么 - https://github.com/mysociety/mapit - 这样做是为了将一个Exception引发到中间件,正如你所说,然后根据提供的格式直接返回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)