【发布时间】:2019-10-07 15:49:12
【问题描述】:
在我们的 web 应用程序中,用户不小心在多个选项卡中打开登录页面并在 Django 中触发“CSRF 令牌丢失或不正确”错误是很常见的。
我想在我们的日志记录中隐藏这条特定消息,因为它会产生大量噪音,而且问题无法真正解决。 另一方面,应该记录登录过程中的任何其他问题,所以我不想从记录中排除整个 Django 应用程序或类。
您对如何抑制这个特定的常见错误消息有什么建议吗?
【问题讨论】:
在我们的 web 应用程序中,用户不小心在多个选项卡中打开登录页面并在 Django 中触发“CSRF 令牌丢失或不正确”错误是很常见的。
我想在我们的日志记录中隐藏这条特定消息,因为它会产生大量噪音,而且问题无法真正解决。 另一方面,应该记录登录过程中的任何其他问题,所以我不想从记录中排除整个 Django 应用程序或类。
您对如何抑制这个特定的常见错误消息有什么建议吗?
【问题讨论】:
根据官方 django documentation,您可以更新您的LOGGING 设置:
'handlers': {
'null': {
'class': 'logging.NullHandler',
},
},
'loggers': {
'django.security.csrf': {
'handlers': ['null'],
'propagate': False,
},
},
【讨论】:
如果你只想抑制这个特定的错误,但仍然记录其他与 CSRF 相关的错误,那就有点棘手了。
CSRF 模块使用名为django.security.csrf 的记录器。该消息记录在_reject method of the CsrfViewMiddleware 中。您可以向该记录器添加一个过滤器,以过滤掉 args 中具有该错误原因的日志记录。看起来像这样:
from django.middleware.csrf import REASON_BAD_TOKEN
def missing_token_filter(record):
return REASON_BAD_TOKEN not in record.args
LOGGING = {
...,
'handlers': {
...
'django.security.csrf': {
'filters': ['missing_token_filter']
}
},
'filters': {
...,
'missing_token_filter: {
'()': 'path.to.missing_token_filter',
},
}
【讨论】: