python - 如何在 View 中捕获 django.http.request.DisallowedHost?

标签 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(request):

    try:
        # Do some stuff

    except DisallowedHost:
        return render(request, 'something.html')

最佳答案

请不要更换中间件或做一些其他奇怪的事情。这非常简单:DisallowedHost() 由在请求对象上调用 get_host() 的第一件事引发。通常,这是一个中间件,因为在请求/响应周期中过早地执行它会导致无法关闭或自定义。

因此首先在链中注入(inject)您的自定义中间件并在那里短路:

# File: main.middleware
from django.shortcuts import redirect
from django.core.exceptions import DisallowedHost


class FriendlyDisallowedHost:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request, *args, **kwargs):
        try:
            checkhost = request.get_host()
        except DisallowedHost:
            return redirect("http://localhost/")
        
        return self.get_response(request)

设置:

MIDDLEWARE = [
    "main.middleware.FriendlyDisallowedHost",
    # ... rest of middleware
]

关于python - 如何在 View 中捕获 django.http.request.DisallowedHost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64579749/

相关文章:

django - 如何在 Django 表单中创建可选的只读字段?

python - 在python中运行命令后输入返回键的同步方式?

python - 使用 .ui 文件的 PySide 小部件意外被垃圾收集

python - 使用正确的 .proto 文件时无法在 python 中解析 Protocol Buffer 文件

python - 如何在 Python 3.1 中调用 Windows API?

python - django 自动添加到应用程序名称末尾

python - 如何使用 Python 2.7 在 Tkinter 中设计 GUI 序列

python - 如何在 Django 管理类中检查图像宽度和高度?

python - Django (1.7) - 数据迁移

python - 无法登录用户在 Django 中使用 selenium 进行测试?