首页 > 解决方案 > Django 中间件捕获异常

问题描述

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

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

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

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

标签: djangoexceptionmiddleware

解决方案


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

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

就是这样,除非您将内容存储在html中,否则它没有任何意义。所以我认为你应该完全避免这个解决方案。response.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")

推荐阅读