我已经使用Django实现了JSON API(作为项目的一部分)。 有时我以JSON格式向用户返回错误。我想通过电子邮件通过标准错误报告程序通知管理员(例如,当未捕获的异常引发时)。但是我也希望返回一些JSON响应,而不是500错误页面。 一些元代码确保一切都清楚:
def request_handler(request):
try:
code_that_rises_an_exception()
return response('{"result":"success"}')
except Exception,e:
notify_admin_about_error(e) # <- this function is required
return response('{"result":"error"}')
谢谢!
答案 0 :(得分:1)
您可以使用Django Middleware。中间件允许您修改/处理提供给视图的Django的HttpRequest对象和视图返回的HttpResponse对象,以及在视图引发异常时采取操作。您可以使用此功能执行各种任务,例如记录您收到的请求的元数据,错误报告等。只要视图引发异常,Django就会调用process_exception,您可以定义process_exception()来发送每当发生异常时邮寄给你。
class ErrorReportingMiddleware(object):
def process_exception(self, request, exception):
send_mail_to_admin(exception) # you can collect some more information here
return HttpResponse('{"result":"error"}') # this response is returned to the user
将该类添加到该元组末尾的settings.py中的MIDDLEWARE_CLASSES变量中。
您的观点将缩减为:
def request_handler(request):
code_that_rises_an_exception()
return response('{"result":"success"}')
现在,如果request_handler引发异常,Django将调用ErrorReportingMiddleware的process_exception方法,该方法将向管理员发送有关异常的邮件,并向浏览器返回JSON响应,而不是500页。我将send_mail_to_admin实现为异步函数,这样django对响应的处理不会因为发送邮件而被阻止,并且会向用户返回快速响应。