Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在视图中捕获django.http.request.DisallowedHost?_Python_Django - Fatal编程技术网

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
]