【问题标题】:Django — send 404 emails without referrerDjango — 发送 404 封邮件,没有推荐人
【发布时间】:2013-04-22 19:40:00
【问题描述】:

来自Django 1.5 documentation

Django 还可以配置为通过电子邮件发送有关断开链接的错误(404“找不到页面”错误)。 Django 在以下情况下发送有关 404 错误的电子邮件:

  • DEBUGFalse;
  • 您的MIDDLEWARE_CLASSES 设置包括django.middleware.common.BrokenLinkEmailsMiddleware

如果满足这些条件,只要您的代码引发 404 并且请求具有引用者,Django 就会向 MANAGERS 设置中列出的用户发送电子邮件。 (没有推荐人的 404 邮件不会打扰他们——这些人通常只是输入损坏的 URL 或损坏的网络“机器人”。

我正在修复一个网络项目,该项目被我之前的人维护得很差。最大的问题之一是没有明确的更改 URI 列表,因此有很多人使用书签或来自 pdf/word 文档的链接可能无处可去。重点是,我需要一种方法来检查没有推荐人的 404。

有没有办法使用这个中间件检查没有引荐来源的 404?我对其他软件甚至不使用 Django 的解决方案持开放态度。它只需要工作。

【问题讨论】:

标签: python django http-status-code-404


【解决方案1】:

你可以只回收 Django 的 middleware 并删除标题中对引用者的条件检查:

class BrokenLinkEmailsMiddleware(object):

    def process_response(self, request, response):
        """
        Send broken link emails for relevant 404 NOT FOUND responses.
        """
        if response.status_code == 404 and not settings.DEBUG:
            domain = request.get_host()
            path = request.get_full_path()
            referer = request.META.get('HTTP_REFERER', 'None')
            is_not_search_engine = '?' not in referer
            is_ignorable = self.is_ignorable_404(path)
            if is_not_search_engine and not is_ignorable:
                ua = request.META.get('HTTP_USER_AGENT', '<none>')
                ip = request.META.get('REMOTE_ADDR', '<none>')
                mail_managers(
                    "Broken link on %s" % domain,
                    "Referrer: %s\nRequested URL: %s\nUser agent: %s\nIP address: %s\n" % (referer, path, ua, ip),
                    fail_silently=True)
        return response

    def is_ignorable_404(self, uri):
        """
        Returns True if a 404 at the given URL *shouldn't* notify the site managers.
        """
        return any(pattern.search(uri) for pattern in settings.IGNORABLE_404_URLS)

【讨论】:

  • 几乎完美地工作了——只需要在对mail_managers()的调用中删除对is_internal的引用。感谢您为我指明正确的方向。
猜你喜欢
  • 2010-12-18
  • 2014-05-11
  • 1970-01-01
  • 2021-06-17
  • 2011-11-12
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多