gpt4 book ai didi

Python Django 异常中间件用于不在 View 中的异常

转载 作者:行者123 更新时间:2023-12-01 03:47:51 28 4
gpt4 key购买 nike

每当我的 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运行测试时,我没有看到我的日志消息出现在我的日志中。

我错过了什么?

最佳答案

一旦 Web 服务器启动,每个中间件都会被初始化。但要实现这一点,您需要在中间件中使用 __init__() 。

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

中间件初始化后,需要有一个 __call__() 方法,该方法会在客户端的每个请求时调用。正是这个方法负责将 Controller 传递给底层中间件或在最后一层(即 View 中间件)之后调用实际 View 。

def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.

response = self.get_response(request)

# Code to be executed for each request/response after
# the view is called.

return response

您需要从 process_exception() 返回一个 HTTPResponse() ,该异常将返回到 response 变量中的中间件的 __call__()在上面的代码中,然后在传出时将其传递给上面的中间件。

由于您的中间件类中没有 __init__()__call__(),因此您的中间件不会被初始化,因此不会将每个请求作为其处理来回中间件层传递。

引用: https://docs.djangoproject.com/en/2.0/topics/http/middleware/#init-get-response

关于Python Django 异常中间件用于不在 View 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708794/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com