Django中的动态允许主机

时间:2020-04-24 06:50:55

标签: django

我正在使用Django开发多租户应用程序。一切正常。但是在ALLOWED_HOST的情况下,我对如何管理动态域名有些困惑。我知道我可以将*用作域中的任何数字,但我不想在允许的主机中使用*。

这是我的问题,有没有办法动态管理允许的主机。

2 个答案:

答案 0 :(得分:0)

该设置应在启动时加载一次-通常,这些设置在生产服务器设置中不会更改。您可以允许多个主机或多个子域。

*。example.com可以运行,或者,如果我没记错的话,您可以传递域列表。

答案 1 :(得分:0)

根据Django doc

此列表中的值可以是完全限定名称(例如'www.example.com'),在这种情况下,它们将与请求的Host标头完全匹配(不区分大小写,不包括端口)。可以将以句点开头的值用作子域通配符:“。example.com”将匹配example.com,www.example.com和example.com的任何其他子域。值“ *”将匹配任何内容;在这种情况下,您有责任提供自己的Host标头验证(可能在中间件中;如果是,则必须在MIDDLEWARE中首先列出该中间件)。

因此,如果要匹配某个子域,则可以使用上述子域通配符。如文档所述,如果要进行其他验证,正确的方法是允许所有主机并编写自己的中间件。

如果您不了解中间件,那么它们是在某些事件发生时添加功能的简单机制。例如,您可以创建一个在收到请求时执行的中间件功能。这是您放置主机验证的正确位置。您可以使用request对象获取主机。 Refer to the official docs关于中间件,如果您想了解更多。

一个简单的中间件类可以解决您的问题-

import requests
from django.http import HttpResponse

class HostValidationMiddleware(object):
    def process_view(self, request, view_func, *args, **kwargs):
        host = request.get_host()
        is_host_valid = # Perform host validation
        if is_host_valid:
           # Django will continue as usual
           return None
        else:
           response = HttpResponse
           response.status_code = 403
           return response

如果您需要更多信息,请在下面评论,我会尽力提供帮助。

相关问题