【问题标题】:Why does Django's flatpages allow logging a 404 error?为什么 Django 的平面页面允许记录 404 错误?
【发布时间】:2011-12-04 08:26:43
【问题描述】:

我注意到关于 Django 的 flatpages 应用程序的一件有趣的事情:它允许 core/handlers/base.py 记录警告 Not Found: $page。因此,我的 Sentry 日志充满了合法页面和工作页面的 404。这似乎是因为首先 Django 记录一个 404,然后它返回一个 HttpResponseNotFound 对象,然后 flatpages 中间件启动并返回一个正确的 200 响应。

我可以认为这是 Django 中的错误吗?我的理由是有效的平面页面不是丢失的页面,因此不应记录 404 消息。难道没有其他方法可以在不将其记录为丢失的情况下捕获 404 吗?

【问题讨论】:

    标签: django django-flatpages


    【解决方案1】:

    我认为您的问题的解决方案很简单:只需将 Sentry404CatchMiddleware 重新排序到您的 MIDDLEWARES 设置的顶部即可。至少,它应该在 flatpages 中间件之上。

    为了解释发生了什么,了解the order 在其中执行中间件会很有帮助。我猜你跟着Sentry docs 把它放在了底部。这使它成为第一个要执行的中间件。如果一个不匹配的 URL 模式的请求进入,Django 会引发 404 并且 Sentry 中间件会记录它。但是 Django 然后会运行其他中间件,而 flatpages 中间件会查找匹配页面是否存在,并实际替换响应。

    如果您将 Sentry 中间件移到顶部,则只会记录在中间件堆栈中冒泡的 404 错误,这可能是您想要的。

    【讨论】:

      【解决方案2】:

      这不是错误,它是 django flatpages 应用程序的工作方式:它的中间件在 404 之后从 url 启动。这就是为什么你的哨兵充满了 404。

      考虑不在哨兵中注册 404。 :/ 我在这里没有看到任何其他方式。

      可能还有另一种解决方案:不要使用middleware,而是尝试包含 flatpages.urls 在您的urlpatterns的末尾

      【讨论】:

      • 问题是:我想注册我的404。我只是不想那里的平面图。
      • @rassie,可能还有另一种解决方案:尝试在 urlpatterns 末尾包含 flatpages.urls,而不是使用中间件。
      • 作为参考,包括 flatpages.urls 将打破 APPEND_SLASH 用于任何不是平面页面的内容。如果您在日志中需要 APPEND_SLASH、平面页面和所有 404,您需要在自定义视图中为平面页面滚动您自己的 CommonMiddleware 替换,或者使用 process_request 为平面页面创建中间件。
      猜你喜欢
      • 2019-09-09
      • 2017-12-17
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多