【发布时间】:2013-09-17 13:47:04
【问题描述】:
我已经正确设置了我的ALLOWED_HOSTS,但我不断收到来自所有类型的站点的请求,这些请求会导致发送此“[Django] ERROR (EXTERNAL IP): Internal Server Error”。
如何忽略此特定错误?
【问题讨论】:
-
你运行的是什么版本的 Django?
标签: python django django-settings
我已经正确设置了我的ALLOWED_HOSTS,但我不断收到来自所有类型的站点的请求,这些请求会导致发送此“[Django] ERROR (EXTERNAL IP): Internal Server Error”。
如何忽略此特定错误?
【问题讨论】:
标签: python django django-settings
在您的 LOGGING 配置中,您可以覆盖处理程序类
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.MyAdminEmailHandler',
'include_html': True,
}
},
现在你可以编写你的 MyAdminEmailHandler 类了。查看AdminEmailHandler中的代码
在发出函数中,如果 (request.META.get('REMOTE_ADDR') 不在 settings.INTERNAL_IPS) 中,就去掉报告
【讨论】:
当Host: http 标头与所需的ALLOWED_HOSTS 设置不匹配时,Django 的CommonMiddleware 会引发SuspiciousOperation 异常。这个异常没有被特殊处理,所以错误会通过日志系统传播。
您可以使用 lborgav 的答案以不同方式转移所有错误消息,但如果您只想捕获这个错误,您可以设计一个自定义中间件。
以下 sn-p 是一个 Middleware 类,您可以将其添加到 settings.py 中的 MIDDLEWARE_CLASSES 以消除此错误。
MIDDLEWARE_CLASSES = [
'myapp.middleware.SquashInvalidHostMiddleware',
....
]
这必须出现在django.middleware.common.CommonMiddleware 之前,因为您想检测错误条件的存在并在处理会产生异常的CommonMiddleware 之前立即返回响应。
# myapp/middleware/__init__.py
from django.core.exceptions import SuspiciousOperation
from django.views.defaults import server_error
class SquashInvalidHostMiddleware(object):
"""
Middleware class to squash errors due to suspicious Host: headers.
"""
def process_request(self, request):
"""
Check for denied Hosts.
"""
try:
# Attempt to obtain Host: from http header. This may elicit a
# SuspiciousOperation if Host: doesn't match ALLOWED_HOSTS.
# Unceremoniously squash these errors to prevent log emails,
# diverting straight to 500 page.
request.get_host()
except SuspiciousOperation:
return server_error(request)
【讨论】: