Python 检查它是否是允许的子域的Djangoic方法
我必须用Python/Django解决这个小问题,我想知道哪种方法是最好的 我有一个允许的域名列表,例如www.google.com、mail.google.com。我想检查一个域名是否被允许。现在,来自www.google.com的请求是有效的,来自mail.google.com的请求也是有效的 然而,我想将www算作一个通配符,这意味着如果我有与上述相同的允许域列表,则来自docs.google.com的请求将被视为有效,因此来自google.com的请求即使不存在于列表中,但由于www.google.com存在且www.是一个领先的通配符,两个域都匹配 实现这一点的最佳方式是什么?下面是我的一个片段,我正试图实现这一点:Python 检查它是否是允许的子域的Djangoic方法,python,django,Python,Django,我必须用Python/Django解决这个小问题,我想知道哪种方法是最好的 我有一个允许的域名列表,例如www.google.com、mail.google.com。我想检查一个域名是否被允许。现在,来自www.google.com的请求是有效的,来自mail.google.com的请求也是有效的 然而,我想将www算作一个通配符,这意味着如果我有与上述相同的允许域列表,则来自docs.google.com的请求将被视为有效,因此来自google.com的请求即使不存在于列表中,但由于www.g
def dispatch(self, request, *args, **kwargs):
url = request.REQUEST['url']
host = urlparse.urlparse(url).netloc.lower().strip()
domains = [domain.host.lstrip('www.') for domain in Domain.objects.all()]
for domain in domains:
if host.endswith(domain):
return super(ProcessRequestView, self).dispatch(request, *args, **kwargs)
return HttpResponseForbidden()
我的域模型只有一个字段,称为主机。我的这个解决方案只命中一分贝,但我确定它是最好的还是最有效的
谢谢首先,如果我想使用通配符,它将不是www,因为www只是一个子域 例如,如果我想让所有谷歌域名注册,我的记录是.google.com。 例如,这将显示www.google.com.au是不允许的。您可以将通配符放在末尾,但是允许使用google.com.example.com,这不是一个好主意。或者,您可能希望允许所有域名以co.UK结尾的英国网站使用.co.UK记录 因此,您应该查找特定于general的子域: 假设域名是docs.google.co.uk,而您只有.co.uk记录 查询docs.google.co.uk-检查是否允许完整主机名 如果有任何通配符定义,则查询.docs.google.co.uk 查询www.google.co.uk 查询.co.uk-宾果你找到一个通配符,它是允许的 无论如何,在您的代码中,您正在从db中选择每个域对象,然后使用循环查找适当的域名。此操作将不必要地减慢您的进程。您应该让数据库来处理不相关域的删除,而不是全部选择它们
def dispatch(self, request, *args, **kwargs):
url = request.REQUEST['url']
host = urlparse.urlparse(url).netloc.lower().strip()
domains = Domain.objects.filter(domain=host)
if len(domains):
return super(ProcessRequestView, self).dispatch(request, *args, **kwargs)
else:
newHost = '.%s' %host
dotPosition = -1
for i in range(newHost.count('.')):
dotPosition = newHost.find('.', dotPosition + 1)
domains = Domain.objects.filter(domain=newHost[dotPosition:])
if len(domains):
return super(ProcessRequestView, self).dispatch(request, *args, **kwargs)
return HttpResponseForbidden()
我希望这会有所帮助。为什么不将google.com存储在您允许的网站列表中?