当你运行一个公共站点时,你应该总是关闭 DEBUG
设置。这将使您的服务器运行得更快,并且还将防止恶意用户看到错误页面可以显示的应用程序的详细信息。
然而,与 DEBUG
设置为 False
意味着您永远不会看到您的网站生成的错误--每个人都会看到您的公共错误页面。您需要跟踪已部署站点中发生的错误,因此Django可以配置为创建包含有关这些错误的详细信息的报告。
什么时候 DEBUG
是 False
,Django将向中列出的用户发送电子邮件 ADMINS
每当您的代码引发未处理的异常并导致内部服务器错误时进行设置(严格来说,对于任何具有500或更大的响应)。这会让管理员立即通知任何错误。的 ADMINS
将获得错误的描述、完整的Python追溯以及有关导致错误的HTTP请求的详细信息。
备注
为了发送电子邮件,Django需要一些设置来告诉它如何连接到邮件服务器。至少,您需要指定 EMAIL_HOST
而且可能 EMAIL_HOST_USER
和 EMAIL_HOST_PASSWORD
尽管根据邮件服务器的配置,可能还需要其他设置。查阅 the Django settings documentation 有关电子邮件相关设置的完整列表。
默认情况下,django将从root@localhost发送电子邮件。但是,有些邮件提供商拒绝来自此地址的所有电子邮件。若要使用其他发件人地址,请修改 SERVER_EMAIL
设置。
若要激活此行为,请将收件人的电子邮件地址 ADMINS
设置。
参见
服务器错误电子邮件是使用日志框架发送的,因此您可以通过以下方式自定义此行为: customizing your logging configuration .
Django还可以配置为通过电子邮件发送有关断开链接的错误(404“找不到页面”错误)。当出现以下情况时,Django会发送大约404个错误的电子邮件:
DEBUG
是 False
;
你的 MIDDLEWARE
设置包括 django.middleware.common.BrokenLinkEmailsMiddleware
.
如果满足这些条件,Django将向 MANAGERS
只要您的代码引发404,并且请求具有引用,就会设置。对于没有推荐人的404,不用费心发电子邮件--这些人通常是输入损坏的URL或损坏的网络机器人。当Referer等于请求的URL时,它也会忽略404,因为这一行为也来自损坏的网络机器人。
备注
BrokenLinkEmailsMiddleware
必须出现在拦截404错误的其他中间件之前,例如 LocaleMiddleware
或 FlatpageFallbackMiddleware
。把它放在你的头顶 MIDDLEWARE
布景。
您可以通过调整 IGNORABLE_404_URLS
设置。它应该是已编译正则表达式对象的列表。例如::
import re
IGNORABLE_404_URLS = [
re.compile(r"\.(php|cgi)$"),
re.compile(r"^/phpmyadmin/"),
]
在本例中,404指向以 .php
或 .cgi
将 not 被报道。任何URL都不会以 /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(如通过电子邮件)传输未加密的错误报告。
错误报告确实有助于调试错误,因此尽可能多地记录这些错误的相关信息通常很有用。例如,默认情况下,Django记录 full traceback 对于引发的异常,每个 traceback frame 的局部变量,以及 HttpRequest
的 attributes .
但是,有时某些类型的信息可能过于敏感,因此可能不适合跟踪,例如用户的密码或信用卡号。因此,除了筛选出看起来很敏感的设置外,如中所述 DEBUG
文档,Django提供了一组函数修饰器来帮助您控制在生产环境(即 DEBUG
设置为 False
): sensitive_variables()
和 sensitive_post_parameters()
.
如果代码中的函数(视图或任何常规回调)使用易受敏感信息影响的局部变量,则可以使用 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
...
在上面的示例中, user
, pw
和 cc
变量将被隐藏并替换为星星 (**********
)在错误报告中,而 name
变量将被披露。
要系统地从错误日志中隐藏函数的所有局部变量,请不要向 sensitive_variables
装饰师:
@sensitive_variables()
def my_function(): ...
使用多个修饰符时
如果要隐藏的变量也是一个函数参数(例如下面的示例中的“user``”),并且修饰函数有多个修饰符,请确保 @sensitive_variables
在装饰链的顶部。这样,它还将在传递给其他修饰符时隐藏函数参数:
@sensitive_variables("user", "pw", "cc")
@some_decorator
@another_decorator
def process_info(user): ...
如果你的一个观点 HttpRequest
对象与 POST parameters
易受包含敏感信息的影响,您可以使用 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_word
和 credit_card_number
Post参数将被隐藏并替换为星号 (**********
)在错误报告内的请求表示中,而 name
参数将被披露。
要在错误报告中系统地隐藏请求的所有post参数,请不要向 sensitive_post_parameters
装饰师:
@sensitive_post_parameters()
def my_view(request): ...
系统地从错误报告中筛选出所有post参数 django.contrib.auth.views
意见 (login
, password_reset_confirm
, password_change
和 add_view
和 user_change_password
在 auth
admin)防止敏感信息(如用户密码)泄漏。
全 sensitive_variables()
和 sensitive_post_parameters()
分别是用敏感变量的名称注释修饰的函数,并注释 HttpRequest
对象具有敏感Post参数的名称,以便稍后在发生错误时可以从报告中过滤出此敏感信息。实际的过滤是由Django的默认错误报告器过滤器完成的: django.views.debug.SafeExceptionReporterFilter
.此过滤器使用装饰者的注释将相应的值替换为星号 (**********
)当生成错误报告时。如果您希望为整个网站覆盖或自定义此默认行为,您需要定义自己的过滤器类并通过 DEFAULT_EXCEPTION_REPORTER_FILTER
设置::
DEFAULT_EXCEPTION_REPORTER_FILTER = "path.to.your.CustomExceptionReporterFilter"
您还可以通过设置 HttpRequest
的 exception_reporter_filter
属性:
def my_view(request):
if request.user.is_authenticated:
request.exception_reporter_filter = CustomExceptionReporterFilter()
...
您的自定义过滤器类需要继承自 django.views.debug.SafeExceptionReporterFilter
并且可以重写以下属性和方法:
要替换敏感值的字符串值。默认情况下,它会用星号替换敏感变量的值 (**********
)。
一个已编译的正规表达对象,用于匹配设置和 request.META
被认为是敏感的值。默认情况下相当于::
import re
re.compile(r"API|AUTH|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE", flags=re.IGNORECASE)
术语 AUTH
加入浓度
退货 True
激活过滤 get_post_parameters()
和 get_traceback_frame_variables()
.默认情况下,如果出现以下情况,过滤器将处于活动状态 DEBUG
是 False
.请注意敏感的 request.META
值始终与敏感设置值一起过滤,如中所述 DEBUG
文件。
返回经过过滤的Post参数字典。敏感值被替换为 cleansed_substitute
。
返回给定追溯帧的局部变量过滤字典。敏感值被替换为 cleansed_substitute
。
如果您需要自定义过滤之外的错误报告,您可以通过定义 DEFAULT_EXCEPTION_REPORTER
设置::
DEFAULT_EXCEPTION_REPORTER = "path.to.your.CustomExceptionReporter"
异常报告器负责编制异常报告数据,并将其适当格式化为文本或HTML。(The例外报告者使用 DEFAULT_EXCEPTION_REPORTER_FILTER
准备异常报告数据时。)
您的自定义记者类需要继承自 django.views.debug.ExceptionReporter
。
属性返回一个 pathlib.Path
表示用于呈现异常的HTML表示形式的模板的绝对文件系统路径。默认为Django提供的模板。
属性返回一个 pathlib.Path
表示用于呈现异常的纯文本表示形式的模板的绝对文件系统路径。默认为Django提供的模板。
与过滤器类一样,您可以通过设置 HttpRequest
张氏 exception_reporter_class
属性::
def my_view(request):
if request.user.is_authenticated:
request.exception_reporter_class = CustomExceptionReporter()
...
参见
还可以通过编写自定义错误报告 exception middleware . 如果您确实编写自定义错误处理,那么最好模拟Django的内置错误处理,并且仅在以下情况下报告/记录错误: DEBUG
是 False
.
5月 28, 2025