我正在使用Django开发多租户应用程序。一切正常。但是在ALLOWED_HOST的情况下,我对如何管理动态域名有些困惑。我知道我可以将*用作域中的任何数字,但我不想在允许的主机中使用*。
这是我的问题,有没有办法动态管理允许的主机。
答案 0 :(得分:0)
该设置应在启动时加载一次-通常,这些设置在生产服务器设置中不会更改。您可以允许多个主机或多个子域。
*。example.com可以运行,或者,如果我没记错的话,您可以传递域列表。
答案 1 :(得分:0)
此列表中的值可以是完全限定名称(例如'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
如果您需要更多信息,请在下面评论,我会尽力提供帮助。