Django - 发送404封电子邮件,不带推荐人

时间:2013-04-22 19:40:00

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

来自Django 1.5 documentation

  

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

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

如果符合这些条件,只要您的代码提出404并且请求有引用,Django就会通过电子邮件向MANAGERS设置中列出的用户发送电子邮件。 (没有给没有引用者的404发送电子邮件 - 这些通常只是输入损坏的网址或破坏网络机器人的人。)

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

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

1 个答案:

答案 0 :(得分:0)

您可以回收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)