【问题标题】:Django 2.0 custom middleware process_exception hook not firingDjango 2.0 自定义中间件 process_exception 挂钩未触发
【发布时间】:2019-01-24 12:31:53
【问题描述】:

我的自定义中间件类似乎在响应周期中跳过了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!")

已配置中间件....

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")

但是,当我点击 url 时,我在控制台日志中得到了这个:

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_requestprocess_response 都没有调用。并且由于某种原因,在我的中间件的process_response 甚至被命中之前,异常回溯显示了两次。为我的中间件传递给process_response 的响应是一个标准的 Django 500 调试页面,表明该异常已被处理,但我的印象是,将我的中间件作为列表中的最后一个意味着它应该是第一个响应周期访问?

编辑所以在进一步播放时,看起来这与 DjangoDebugToolbar 有某种关系,当我禁用它并删除中间件时,我的中间件工作正常。我对此感到困惑,因为我的中间件应该首先触发。

EDIT 2 具体来说,它似乎是分析面板?评论它解决了这个问题......多么奇怪

【问题讨论】:

  • 您的代码对我来说是正确的。你确定“例外!”输出中没有任何地方吗? (您已忽略它,因此很难确定。)作为进一步的测试,请尝试从您的 process_exception() 返回回复。
  • 我检查了输出 - 没有打印语句的痕迹。我在其中添加了一个 pdb 断点,它也没有被命中,因此该方法被完全跳​​过。我会继续挖掘,看看代码中是否有一些过时的错误处理会弄乱一切
  • 更新了问题-看起来调试工具栏是原因。还没有解决方案

标签: django django-middleware


【解决方案1】:

所以我最终找到了https://github.com/jazzband/django-debug-toolbar/issues/497,它在 Django 调试工具栏中的 Profiling 面板中将此列为错误。非常令人沮丧,因为它以一种非常不明显的方式破裂。

修复方法是:不要使用分析面板或将 Django 调试工具栏放在中间件列表的最后,并接受 DDT 不会监控任何中间件类

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 2021-06-29
    • 2015-02-21
    • 2023-02-06
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多