Мой пользовательский класс промежуточного программного обеспечения, кажется, пропускает этап process_exception
во время цикла ответа
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print("Request!")
def process_response(self, request, response):
print("Response!")
return response
def process_exception(self, request, exception):
print("Exception!")
Middleware настроено ....
DJANGO_MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
LOCAL_MIDDLEWARE = [
'path.to.MyMiddleware',
]
MIDDLEWARE = DJANGO_MIDDLEWARE + LOCAL_MIDDLEWARE
и похоронен на мой взгляд код:
def some_view(request):
...
raise Exception("foo")
Однако, когда я нажимаю на ссылку, я получаю это в журнале консоли:
Request!
Internal Server Error: /my/url/
Traceback (most recent call last):
... long traceback ...
File "/path/to/my/views.py", line 184, in some_view
raise Exception("foo")
Exception: foo
ERROR django.request 2019-01-24 11:50:48,270 [exception.py handle_uncaught_exception 118] Internal Server Error: /my/url/
Traceback (most recent call last):
... long traceback ...
File "/path/to/my/views.py", line 184, in some_view
raise Exception("foo")
Exception: foo
Response!
Как видите, process_exception
вообще не вызывается, process_request
и process_response
оба. И по какой-то причине трассировка исключений показывается дважды до того, как process_response
моего промежуточного программного обеспечения даже ударится. Ответ, который передается на process_response
для моего промежуточного программного обеспечения, представляет собой стандартную страницу отладки Django 500, предполагающую, что исключение уже обработано, но у меня сложилось впечатление, что наличие промежуточного программного обеспечения в качестве последнего в списке означает, что оно должно быть первым быть доступным для цикла ответа?
РЕДАКТИРОВАТЬ Так что при дальнейшем воспроизведении похоже, что это как-то связано с DjangoDebugToolbar, когда я отключаю это и удаляю промежуточное ПО, мое промежуточное ПО работает нормально. Я озадачен этим, потому что мое промежуточное ПО должно запускаться первым.
РЕДАКТИРОВАТЬ 2 В частности, это, кажется, панель профилирования? комментируя это исправляет проблему ... как bizzare