Django中间件捕获异常

时间:2018-11-27 21:18:28

标签: django exception middleware

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

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

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

更新: 我试图通过登录过程来实现。哪个没有用。

1 个答案:

答案 0 :(得分:1)

好吧,您可以尝试捕获中间件中的任何异常,如下所示:

from django.core.urlresolvers import resolve


class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

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

仅此而已,没有任何意义,除非您存储来自response.content的内容,该内容充满了 html 。因此,我认为您应该完全避免该解决方案。

最好的方法是使用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")