【问题标题】:Django middleware to catch exceptionsDjango 中间件捕获异常
【发布时间】:2018-11-27 21:18:27
【问题描述】:

我正在尝试创建一个 Django 中间件来检查视图是否引发了异常。

您能否举一些例子说明如何发生异常以及如何通过自定义中间件进行处理。

最后我想将这些异常存储在数据库中。

更新: 我试图通过登录过程来实现这一点。这没有用。

【问题讨论】:

  • 您要捕获哪些异常? HTTP?或代码?如果在代码中,您可以通过自己的记录器捕获它。
  • @Roger 我想在视图产生异常时捕获异常。它必须通过中间件来完成。

标签: django exception middleware


【解决方案1】:

好吧,您可以尝试像这样在中间件中捕获任何异常:

from django.core.urlresolvers import resolve


class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        response = self.get_response(request)
        if response.status_code == 500:
            current_url = resolve(request.path_info).view_name
            content = response.content
            ExceptionHandlerModel.objects.create(url = current_url,stacktrace = content, ...) # other data you want to store here
        return response

就是这样,它没有任何意义,除非您存储来自充满htmlresponse.content 的内容。所以我认为你应该完全避免这个解决方案。

最好的方法是使用logger。例如在你的loginview,你可以这样尝试:

import logging
logger = logging.getLogger(__name__)

def loginview(request):
    ...
    user = authenticate(username, password)
    if not user:
        logger.error('Username {} failed to login'.format(username))

登录视图也不一定会抛出异常(除非你强行抛出它们)。例如:

class YourAuthException(Exception):
   # defining a custom exception
   pass

# in view
if not user:
   raise YourAuthException("User login failed")

更新

def get_user(request)

    user = User.objects.get(id=99999999999)  # an id which does not exist in DB
    return HttpResponse("OK GOT IT")

【讨论】:

  • 谢谢!登录表单似乎不是一个好方法。你能推荐另一个例子吗?我需要捕获一个异常并将其保存到数据库中。
  • 好吧,你为什么不在视图中捕获异常呢?因为中间件并不能完全满足您的要求。
  • 这是一项任务,他们要求提供中间件
  • 谢谢,您对我很有帮助,但我似乎无法使其与登录表单一起使用,因此我愿意接受其他有关如何实现该功能的建议
  • @Danae 通过捕获异常,如果您的意思是通过 except Exception 捕获异常,不幸的是,在 django 中间件中无法做到这一点。你能做的最好的就是以 html 格式存储完整的堆栈跟踪,这将在response.content 中提供(请参阅我对此的回答)
猜你喜欢
  • 2022-12-02
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2013-05-21
  • 2015-02-10
  • 2012-01-21
相关资源
最近更新 更多