错误报告

在运行公共站点时,应始终关闭DEBUG设置。 这将使您的服务器运行速度更快,并且还可以防止恶意用户查看可以由错误页面显示的应用程序的详细信息。

然而,运行DEBUG设置为False意味着您永远不会看到您的网站产生的错误 - 每个人都只会看到您的公共错误页面。 您需要跟踪部署站点中发生的错误,因此可以将Django配置为创建有关这些错误的详细信息的报告。

电子邮件报告

服务器错误

DEBUGFalse时,只要代码引发未处理的异常并导致内部服务器错误,Django就会通过电子邮件发送ADMINS (HTTP状态码500)。 这使管理员能够立即通知任何错误。 The ADMINS will get a description of the error, a complete Python traceback, and details about the HTTP request that caused the error.

注意

为了发送电子邮件,Django需要一些设置来告诉它如何连接到你的邮件服务器。 至少,您需要指定EMAIL_HOSTEMAIL_HOST_USEREMAIL_HOST_PASSWORD,不过也可能需要指定其他设置服务器的配置。 请参阅the Django settings documentation以获取电子邮件相关设置的完整列表。

默认情况下,Django会从root @ localhost发送邮件。 但是,某些邮件提供商拒绝来自该地址的所有电子邮件 要使用不同的发件人地址,请修改SERVER_EMAIL设置。

要激活此行为,请将收件人的电子邮件地址放在ADMINS设置中。

也可以看看

服务器错误电子邮件是使用日志框架发送的,因此您可以通过customizing your logging configuration来自定义此行为。

404错误

Django也可以配置为通过电子邮件发送错误链接(404“页面未找到”错误)的错误。 在以下情况下,Django发送关于404错误的电子邮件

如果这些条件得到满足,Django会在您的代码提出404并且请求具有引用者时,通过电子邮件发送MANAGERS设置中列出的用户。 不用费力地给那些没有引用的404s发送邮件 - 那些通常只是输入破坏的URL或破坏的Web机器人的人。 当引用者等于请求的URL时,它也会忽略404s,因为这种行为也是来自破坏的Web机器人。

注意

BrokenLinkEmailsMiddleware must appear before other middleware that intercepts 404 errors, such as LocaleMiddleware or FlatpageFallbackMiddleware. 把它放在你的MIDDLEWARE设置的顶部。

您可以通过调整IGNORABLE_404_URLS设置来告诉Django停止报告特定的404s。 它应该是已编译的正则表达式对象的列表。 例如:

import re
IGNORABLE_404_URLS = [
    re.compile(r'\.(php|cgi)$'),
    re.compile(r'^/phpmyadmin/'),
]

In this example, a 404 to any URL ending with .php or .cgi will not be reported. 任何以/phpmyadmin/开头的网址都不会。

以下示例显示如何排除浏览器和搜寻器经常请求的一些常规URL:

import re
IGNORABLE_404_URLS = [
    re.compile(r'^/apple-touch-icon.*\.png$'),
    re.compile(r'^/favicon\.ico$'),
    re.compile(r'^/robots\.txt$'),
]

(请注意,这些是正则表达式,所以我们在期间前面加了一个反斜杠来转义它们。)

如果您想进一步自定义django.middleware.common.BrokenLinkEmailsMiddleware的行为(例如忽略来自Web搜寻器的请求),则应该对其进行子类化并覆盖其方法。

也可以看看

使用日志框架记录404错误。 默认情况下,这些日志记录将被忽略,但是您可以通过编写处理程序和configuring logging来适当地将它们用于错误报告。

过滤错误报告

警告

过滤敏感数据是一个难题,几乎不可能保证敏感数据不会泄漏到错误报告中。 因此,只有受信任的团队成员才能使用错误报告,并且应避免通过Internet传输未加密的错误报告(例如通过电子邮件)。

过滤敏感信息

错误报告对调试错误非常有帮助,所以通常尽可能多地记录有关这些错误的相关信息。 For example, by default Django records the full traceback for the exception raised, each traceback frame’s local variables, and the HttpRequest’s attributes.

然而,有时某些类型的信息可能太敏感,因此可能不适合跟踪例如用户的密码或信用卡号码。 因此,除了按照DEBUG文档中的描述过滤出看似敏感的设置之外,Django还提供了一组函数装饰器,以帮助您控制哪些信息应从生产环境中的错误报告中过滤掉(即,DEBUG设置为False):sensitive_variables()sensitive_post_parameters()

sensitive_variables(*variables)[source]

如果代码中的函数(视图或任何常规回调函数)使用易受敏感信息影响的局部变量,则可以使用sensitive_variables修饰符来防止这些变量的值包含在错误报告中:

from django.views.decorators.debug import sensitive_variables

@sensitive_variables('user', 'pw', 'cc')
def process_info(user):
    pw = user.pass_word
    cc = user.credit_card_number
    name = user.name
    ...

在上面的例子中,userpwcc变量的值将被隐藏并被星号替换(*** *******),而name变量的值将被公开。

要系统地从错误日志中隐藏某个函数的所有局部变量,请不要向sensitive_variables修饰器提供任何参数:

@sensitive_variables()
def my_function():
    ...

当使用多个装饰器

如果你想隐藏的变量也是一个函数参数(例如下面例子中的'user'),并且装饰的函数有多个装饰器,那么确保将@sensitive_variables 这样它也会隐藏函数参数,因为它通过其他的装饰器:

@sensitive_variables('user', 'pw', 'cc')
@some_decorator
@another_decorator
def process_info(user):
    ...
sensitive_post_parameters(*parameters)[source]

如果其中一个视图接收到POST parametersHttpRequest对象,则可能会阻止使用sensitive_post_parameters装饰器将这些参数的值包含在错误报告中:

from django.views.decorators.debug import sensitive_post_parameters

@sensitive_post_parameters('pass_word', 'credit_card_number')
def record_user_profile(request):
    UserProfile.create(
        user=request.user,
        password=request.POST['pass_word'],
        credit_card=request.POST['credit_card_number'],
        name=request.POST['name'],
    )
    ...

在上面的例子中,pass_wordcredit_card_number POST参数的值将被隐藏并被星号替换(********** )在错误报告中的请求表示中,而name参数的值将被公开。

要在错误报告中系统地隐藏请求的所有POST参数,请不要向sensitive_post_parameters装饰器提供任何参数:

@sensitive_post_parameters()
def my_view(request):
    ...

All POST parameters are systematically filtered out of error reports for certain django.contrib.auth.views views (login, password_reset_confirm, password_change, and add_view and user_change_password in the auth admin) to prevent the leaking of sensitive information such as user passwords.

自定义错误报告

所有sensitive_variables()sensitive_post_parameters() do分别使用敏感变量的名称对装饰后的函数进行注释,并用HttpRequest敏感的POST参数的名称,以便以后可以在发生错误时将这些敏感信息过滤掉。 实际的过滤是由Django的默认错误记者过滤器完成的:django.views.debug.SafeExceptionReporterFilter 此过滤器在生成错误报告时使用修饰符的注释来替换星号(**********)的对应值。 如果您希望覆盖或自定义整个站点的默认行为,则需要定义自己的过滤器类,并通过DEFAULT_EXCEPTION_REPORTER_FILTER设置告诉Django使用它:

DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter'

您还可以通过设置HttpRequestexception_reporter_filter属性,以更细粒度的方式控制在任何给定视图中使用哪个过滤器:

def my_view(request):
    if request.user.is_authenticated:
        request.exception_reporter_filter = CustomExceptionReporterFilter()
    ...

您的自定义过滤器类需要从django.views.debug.SafeExceptionReporterFilter继承,并可能会覆盖以下方法:

SafeExceptionReporterFilter[source]
SafeExceptionReporterFilter。is_active(request)[source]

返回True激活在其他方法中操作的过滤。 默认情况下,如果DEBUGFalse,则过滤器处于活动状态。

SafeExceptionReporterFilter。get_post_parameters(request)[source]

返回POST参数的过滤字典。 默认情况下,它用星号(**********)替换敏感参数的值。

SafeExceptionReporterFilter。get_traceback_frame_variablesrequesttb_frame[source]

返回给定回溯帧的局部变量的过滤字典。 默认情况下,它用星号(**********)替换敏感变量的值。

也可以看看

您也可以通过编写自定义的exception middleware来设置自定义错误报告。 如果您编写自定义错误处理,那么模拟Django的内置错误处理并且仅在DEBUGFalse时报告/记录错误是个好主意。