Django 中间件捕获异常

Dan*_*nae 6 django middleware exception

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

您能否举一些例子来说明如何出现异常以及如何通过自定义中间件处理该异常。

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

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

rud*_*dra 4

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

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
Run Code Online (Sandbox Code Playgroud)

就是这样,除非您存储充满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))
Run Code Online (Sandbox Code Playgroud)

登录视图也不一定会抛出异常(除非您强制抛出异常)。例如:

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

# in view
if not user:
   raise YourAuthException("User login failed")
Run Code Online (Sandbox Code Playgroud)

更新

def get_user(request)

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

  • @Danae 通过捕获异常,如果你的意思是通过 ` except Exception` 捕获异常,不幸的是,在 django 中间件中不可能做到这一点。你能做的最好的事情就是以 html 格式存储完整的堆栈跟踪,该格式将在 `response.content` 中提供(请参阅我对此的回答) (2认同)