我已正确设置ALLOWED_HOSTS
,但我不断收到所有类型网站的请求,导致此问题导致[Django]错误(外部IP):内部服务器错误'被送出去。
如何忽略此特定错误?
答案 0 :(得分:5)
当SuspiciousOperation
http标头与所需的CommonMiddleware
设置不匹配时,Django的Host:
会引发ALLOWED_HOSTS
异常。此异常未经过特殊处理,因此错误将通过日志记录系统传播。
您可以使用lborgav的答案以不同方式转移所有错误消息,但如果您只想捕获这一个错误,则可以设计自定义中间件。
以下代码段是Middleware课程,您可以将其添加到MIDDLEWARE_CLASSES
中的settings.py
以压缩此错误。
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)
答案 1 :(得分:2)
在LOGGING配置中,您可以覆盖处理程序类
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.MyAdminEmailHandler',
'include_html': True,
}
},
现在您可以编写您的类MyAdminEmailHandler。在AdminEmailHandler
中查看其代码在emit函数中,只需删除报告if(request.META.get('REMOTE_ADDR')不在settings.INTERNAL_IPS中)