Django中间件捕获异常

Django中间件捕获异常,django,exception,middleware,Django,Exception,Middleware,我正在尝试创建一个Django中间件,用于检查视图是否引发异常 您能否给出一些例子,说明如何出现异常,以及如何通过自定义中间件处理异常 最后,我想将这些异常存储在数据库中 更新: 我试图通过登录过程实现这一点。这是行不通的 您可以尝试捕获中间件中的任何异常,如下所示: from django.core.urlresolvers import resolve class SimpleMiddleware: def __init__(self, get_response):

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

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

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

更新:
我试图通过登录过程实现这一点。这是行不通的

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

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
import logging
logger = logging.getLogger(__name__)

def loginview(request):
    ...
    user = authenticate(username, password)
    if not user:
        logger.error('Username {} failed to login'.format(username))
就是这样,除非您存储
response.content
中的内容,否则没有任何意义,,它充满了html。所以我认为你应该完全避免这个解决方案

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

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
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")
更新
你想抓住哪些例外情况?HTTP?还是密码?如果在代码中,您可以通过自己的记录器捕获它。@罗杰,如果视图生成异常,我想捕获异常。它必须通过中间件来完成。谢谢!看来登录表单不是一个好方法。你能再举一个例子吗。我需要捕获一个异常并将其保存到数据库中。那么,为什么不在视图中捕获异常呢?因为中间件并不完全符合你的要求。这是一项任务,他们要求提供一个中间件。你帮了很大的忙,但我似乎无法让它与登录表单一起工作,所以我愿意接受关于如何实现的其他建议that@Danae通过捕获异常,如果您的意思是通过异常捕获异常,那么不幸的是,在django中间件中不可能这样做。您所能做的最好是以html格式存储完整的stacktrace,该格式将在
response.content
中提供(请参阅我对此的回答)