Python 如何在视图中捕获django.http.request.DisallowedHost?
这项工作:Python 如何在视图中捕获django.http.request.DisallowedHost?,python,django,Python,Django,这项工作: def index(request): try: # Do some stuff except: return render(request, 'something.html') 但是我如何才能捕捉到错误:django.http.request.DisallowedHost 您尝试过这个,但它不起作用: from django.core.exceptions import DisallowedHost def index(req
def index(request):
try:
# Do some stuff
except:
return render(request, 'something.html')
但是我如何才能捕捉到错误:django.http.request.DisallowedHost
您尝试过这个,但它不起作用:
from django.core.exceptions import DisallowedHost
def index(request):
try:
# Do some stuff
except DisallowedHost:
return render(request, 'something.html')
您可以为此使用自定义中间件 为此,通过对类进行子分类并重写方法来创建自定义中间件
请不要更换中间件或做其他奇怪的事情。这很简单:DisallowedHost()由对请求对象调用
get\u host()
的第一件事引发。通常,这是一个中间件,因为在请求/响应周期中过早地使用它会导致无法关闭或自定义
因此,首先在链中注入自定义中间件,并在其中简化:
#文件:main.middleware
从django.shortcuts导入重定向
从django.core.exceptions导入DisallowedHost
类FriendlyDisallowedHost:
定义初始化(自我,获取响应):
self.get\u response=get\u response
定义调用(self、request、*args、**kwargs):
尝试:
checkhost=request.get\u host()
除不允许的主机外:
返回重定向(“http://localhost/")
返回self.get_响应(请求)
设置:
MIDDLEWARE = [
"main.middleware.FriendlyDisallowedHost",
# ... rest of middleware
]
因为Django将在调用视图之前拦截请求并引发此异常,所以您应该使用来处理覆盖 在应用程序视图中,编写要处理的处理程序
DisallowedHost
从django.views.defaults导入错误请求作为默认错误请求
从django.core.exceptions导入DisallowedHost
从django.http导入HttpResponse
def my_bad_request_处理程序(请求,异常=None,**kwargs):
如果isinstance(异常,不允许主机):
返回HttpResponse(“此服务器未为此主机名配置”,状态=400)
#如果是其他类型的错误请求,请使用Django的默认处理程序
返回默认错误请求(请求、异常、**kwargs)
然后在URLConf中将400处理程序设置为自定义视图:
handler400='mysite.views.my\u bad\u request\u handler'
另请参见:异常和。您为什么要捕获此信息?您知道,如果在设置中的allowd_主机中添加“*”,则不会出现此异常?@AmirAfianian我的项目服务于许多域。当有人将服务器指向我们,但没有更新应用程序中的域时,我希望显示一条有用的错误消息,而不仅仅是500.Is
django.http.request.DisallowedHost
与django.core.exceptions.DisallowedHost
相同?
# settings.py
MIDDLEWARE = [
# other middleware
'some_place.some_module.CustomCommonMiddleware', # add this
'django.middleware.common.CommonMiddleware', # Remove this
# other middleware
]
MIDDLEWARE = [
"main.middleware.FriendlyDisallowedHost",
# ... rest of middleware
]