有没有人对中间件捕获异常的最佳方法有意见,而不是将错误呈现为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没有,还有其他的吗?)
答案 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)