Django 错误电子邮件太长。我该如何截断它?

2024-02-09

Django 1.9 中的错误电子邮件似乎比以前长得多。有一个完整的“设置”部分,我认为这是多余的,而且可能太暴露了。

编辑 Django 发送的错误电子邮件的最佳方法是什么?

编辑:我不仅仅是想隐藏敏感信息。 Django 1.9 中的电子邮件内容较多,我想将电子邮件的格式更改为更短。我喜欢它的旧方式。


有一个 django 模板变量TECHNICAL_500_TEMPLATE/TECHNICAL_500_TEXT_TEMPLATE in the Django 调试视图 https://github.com/django/django/blob/1.9.5/django/views/debug.py它控制错误报告中可见的内容,当然还有错误电子邮件。注释解释说模板位于 python 变量中,因此在模板加载器中断时可能会生成错误。您可以在 django 包中更改此变量,但我不建议这样做。TECHNICAL_500_TEMPLATE被引用的是ExceptionReporter类在同一个文件中。

班上AdminEmailHandler in Django 实用程序日志 https://github.com/django/django/blob/1.9.5/django/utils/log.py然后使用ExceptionReporter生成 html 错误报告。

你可以子类化AdminEmailHandler并覆盖emit函数包含您的子类版本ExceptionReporter使用您自己定义的TECHNICAL_500_TEMPLATE.

这是一个例子:

Create reporter.py with

from copy import copy

from django.views import debug
from django.utils import log
from django.conf import settings
from django import template

TECHNICAL_500_TEMPLATE = """
    # custom template here, copy the original and make adjustments
"""
TECHNICAL_500_TEXT_TEMPLATE = """
    # custom template here, copy the original and make adjustments
"""

class CustomExceptionReporter(debug.ExceptionReporter):
    def get_traceback_html(self):
        t = debug.DEBUG_ENGINE.from_string(TECHNICAL_500_TEMPLATE)
        c = template.Context(self.get_traceback_data(), use_l10n=False)
        return t.render(c)

    def get_traceback_text(self):
        t = debug.DEBUG_ENGINE.from_string(TECHNICAL_500_TEXT_TEMPLATE)
        c = template.Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
        return t.render(c)

class CustomAdminEmailHandler(log.AdminEmailHandler):
    def emit(self, record):
        try:
            request = record.request
            subject = '%s (%s IP): %s' % (
                record.levelname,
                ('internal' if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS
                 else 'EXTERNAL'),
                record.getMessage()
            )
        except Exception:
            subject = '%s: %s' % (
                record.levelname,
                record.getMessage()
            )
            request = None
        subject = self.format_subject(subject)

        no_exc_record = copy(record)
        no_exc_record.exc_info = None
        no_exc_record.exc_text = None

        if record.exc_info:
            exc_info = record.exc_info
        else:
            exc_info = (None, record.getMessage(), None)

        reporter = CustomExceptionReporter(request, is_email=True, *exc_info)
        message = "%s\n\n%s" % (self.format(no_exc_record), reporter.get_traceback_text())
        html_message = reporter.get_traceback_html() if self.include_html else None
        self.send_mail(subject, message, fail_silently=True, html_message=html_message)

然后只需设置 django 设置即可在中使用新处理程序记录部分 https://docs.djangoproject.com/en/1.9/topics/logging/.

LOGGING = {
    # Your other logging settings
    # ...
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'project.reporter.CustomAdminEmailHandler',
            'filters': ['special']
        }
    },
}

如果您只是想隐藏设置,可以注释掉'settings': get_safe_settings(),第 294 行,如果您覆盖并复制粘贴def get_traceback_data(self):在你的CustomExceptionReporter

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 错误电子邮件太长。我该如何截断它? 的相关文章

随机推荐

  • 在CSS中,当我滚动滚动条时,
  • 的背景颜色消失了
  • HTML 代码如下 div ol li class a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa li li class b bbbbbbbbbbbbbbbbbbbbb
  • 使用 PointToScreen 在 wpf 中查找控件的位置

    我正在尝试在主窗口内找到用户控件的相对坐标 我尝试使用 Control PointToScreen 方法 但没有成功 每次我这样做时 我都会收到一个异常 System InvalidOperationException 此视觉对象未连接到P
  • 使用 -rpath 和 $ORIGIN 链接时查找失败

    我正在尝试学习如何使用 rpathGCC 链接器 ld 中的选项 ORIGIN 我正在尝试我能想到的最简单的例子 见下文 我读到的所有链接似乎都说我做得正确 但是 当我运行可执行文件时 它无法找到共享对象 除非我从内部运行它 ORIGIN
  • 使用截然不同的需要了解的信息集对产品进行建模并将它们链接到订单项?

    我目前正在一个网站上工作 该网站销售各种类型的定制产品 我已经得到了通用的标准购物车模式 订单有许多 LineItems LineItems 有一个产品 但我遇到了一些症结 假设我们的一个产品是一个球 而我们的一个产品是一盒蜡笔 当人们创建
  • 返回类型与 Object.getClass() 不兼容

    该代码是在 eclipse 上导入 webservice 文件时生成的 但是 我在编译时看到了这个错误 返回类型与Object getClass 有什么想法可以解决这个问题吗 public java lang String getClass
  • Firestore 模拟器 REST API 身份验证

    我正在寻找 Firestore 模拟器 REST API 处理未经身份验证的请求的方式的预期行为的一些确认 因为我认为我可能发现了一些可能的不一致之处 我一直在使用 Postman 的个人项目来使用 Firestore Emulator R
  • 实体框架 6.1 更新记录的子集

    我有一个仅封装的视图模型some数据库模型属性 视图模型包含的这些属性是我想要更新的唯一属性 我希望其他财产能够保持其价值 在我的研究过程中我发现this https stackoverflow com a 15339512 2015959
  • mediaelement.js - 在第一个视频末尾播放另一个视频

    由克罗克 Video forEveryone 推荐 我希望能够在第一个视频结束后自动播放第二个视频 然后在第二个视频结束后显示静态图像 经过一段设定的时间后 循环回到第一个视频 Thanks function audio video med
  • 启动带有视频的 Youtube 应用程序

    我有一个带有 UIButton 的应用程序 我希望 当我单击 iPhone 启动 Youtube 应用程序的按钮时 我的视频可以直接开始播放 我尝试了以下代码 UIApplication sharedApplication openURL
  • 如何查找表中长列的长度

    我在名为 Files 的表中有一个名为 FileSize 的 LONG 列 为了实现这一目标 我做了以下工作 我编写了这个 PL SQL 脚本来查找大小 declare long var LONG 0 begin dbms output p
  • 有状态 Rsocket 应用程序

    在我的项目中 我想让多个客户端连接到一个服务 我正在使用 java Rsocket 实现 该服务应该为每个客户端维护一个状态 现在 我可以通过某种标识符来管理客户端 这个选项我已经实现了 但我不想使用字符串手动管理会话 所以另一个想法是通过
  • 在 C# 中使用委托

    在 C 语言和 NET 框架中 你能帮助我理解委托吗 我试图检查一些代码 发现收到的结果出乎我的意料 这里是 class Program public static int I 0 static Func
  • 为什么元组联合期望“never”作为“.includes()”参数?

    type Word foo bar baz const schema foo foo as const bar bar as const baX bar baz as const const testFn schemaKey keyof t
  • Rails:无效的单表继承类型错误

    因此 我正在努力使用现有数据库迁移这个 php 站点 但我无法将其更改为 Rails 这里有张桌子 Quotes有一列名为type 每当我尝试创建此模型并设置类型时 它都会告诉我以下错误 ActiveRecord SubclassNotFo
  • C++ 中重载赋值运算符

    据我了解 重载operator 时 返回值应该是非常量引用 A A operator const A check for self assignment do assignment return this 在以下情况下允许调用非常量成员函数
  • 使用字符串插值将字符串格式化为列

    我需要打印双精度数 以便为值的字符串表示分配一定数量的符号 例如 8 接下来的单词应该从每个字符串中的字符串开头的相同索引处开始 我现在有 value 0 test value 0 3333333333333 test value 0 5
  • 如果所有给定单词都在字符串中,则匹配正则表达式

    假设我有一个这样的查询 一二三 如果我用 替换空格 管道字符 如果字符串包含一个或多个这些单词 我可以匹配该字符串 这就像逻辑 或 是否有类似的东西可以进行逻辑与 只要字符串中存在所有单词 无论单词顺序如何 它都应该匹配 不幸的是我离开了我
  • 当两个 .c 文件具有相同符号但不同类型的全局变量时,引用如何工作?

    C 假设我有以下 C 模块 MODULE 1 include
  • 自动/机器人消息发布到 Microsoft-Teams 聊天室

    如何自动将消息发布到 Microsoft Teams 中的聊天室 这是针对单向消息传递的 即发布消息 而不是阅读消息 这里的大局是我们正在评估不同的群聊解决方案 其中一项要求是将错误消息从各种服务和程序发布到聊天室 一个明智的方法似乎是建立
  • Django 错误电子邮件太长。我该如何截断它?

    Django 1 9 中的错误电子邮件似乎比以前长得多 有一个完整的 设置 部分 我认为这是多余的 而且可能太暴露了 编辑 Django 发送的错误电子邮件的最佳方法是什么 编辑 我不仅仅是想隐藏敏感信息 Django 1 9 中的电子邮件