Пользовательское промежуточное ПО Django 2.0 не срабатывает - PullRequest
0 голосов
/ 24 января 2019

Мой пользовательский класс промежуточного программного обеспечения, кажется, пропускает этап 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

1 Ответ

0 голосов
/ 24 января 2019

Таким образом, я в итоге нашел https://github.com/jazzband/django-debug-toolbar/issues/497, который перечисляет это как ошибку с панелью профилирования на панели отладки Django.Весьма разочаровывает, так как он ломается крайне неочевидным способом.

Исправления: либо не используйте панель профилирования, ни ставьте панель отладки Django последней в списке промежуточного программного обеспечения и принимайте, что DDT не будет отслеживать какие-либоваших промежуточных классов

...