【发布时间】:2016-08-01 21:59:02
【问题描述】:
每当在我的 django 应用程序中发现异常时,我想使用自定义中间件类来处理异常并发送电子邮件。
import logging
from django.core.mail import send_mail
class ErrorMiddleware(object):
logger = logging.getLogger(__name__)
def process_exception(self, request, exception):
self.logger.debug("Middleware has caught an exception. exception={}".format(exception.message))
# send_mail("Your Subject", "This is a simple text email body.",
# "Yamil Asusta <hello@yamilasusta.com>", ["yamil@sendgrid.com"])
return None
我已将中间件添加到我的设置文件中,
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
# custom middleware
'buildconfig.middleware.ErrorMiddleware.ErrorMiddleware',
)
并编写了以下测试用例来测试中间件处理我的异常...
from django.test import TestCase
from mock import patch
from mock import Mock
class TestErrorMiddleware(TestCase):
def test_process_exception_catches_exceptions(self):
raise Exception
但是,当我通过 manage.py 运行测试时,我的日志中没有显示我的日志消息。
我错过了什么?
【问题讨论】:
-
您是否正确设置了日志处理程序?
-
但是...您的测试本身会引发异常。您没有在请求的上下文中运行它,那么中间件怎么可能捕获它?
-
我希望它捕获所有异常,而不仅仅是视图中的请求发生的异常。
-
但是中间件并不是魔法。它只能捕获中间件实际运行的上下文中发生的错误;也就是说,在请求中。
标签: python django exception-handling