我正在使用django开发多租户应用程序。一切都运行得很好。但在ALLOWED_HOST的情况下,我有一点困惑,那就是如何管理动态域名。我知道我可以使用*来表示域的任何数字,但我不想在允许的主机中使用*。
我的问题是,是否有任何方法可以动态管理允许的主机。
发布于 2020-04-24 15:02:15
该设置应在启动时加载一次-通常,这些设置在生产服务器设置中不会更改。您可以允许多个主机,也可以允许多个子域。
*.example.com可以工作,或者如果我没记错的话,你可以传送域的列表。
发布于 2020-04-24 15:08:48
根据Django doc的说法
此列表中的主机值可以是完全限定的名称(例如'www.example.com'),在这种情况下,它们将与请求的
标头完全匹配(不区分大小写,不包括端口)。以句点开头的值可用作子域通配符:'.example.com‘将匹配example.com、www.example.com和example.com的任何其他子域。值'*‘将匹配任何内容;在这种情况下,您需要提供自己的Host头验证(可能是在中间件中;如果是,则必须首先在中间件中列出此中间件)。
因此,如果您想匹配某个子域,可以使用如上所述的子域通配符。如果您想要一个不同的验证,正如文档所说,正确的方法将是允许所有主机并编写您自己的中间件。
如果您不了解中间件,那么它们是一种在特定事件发生时添加功能的简单机制。例如,您可以创建一个在收到请求时执行的中间件函数。这将是您放置Host验证的正确位置。您可以使用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如果您需要更多信息,请在下面发表评论,我将尽力帮助您。
https://stackoverflow.com/questions/61402742
复制相似问题