我必须在Python / Django中解决这个小问题,我想知道哪个是最好的方法。
我有一个允许的域列表,例如www.google.com
,mail.google.com
。我想检查是否允许域名。现在,来自www.google.com
的请求有效,来自mail.google.com
的请求也有效。
但是,我想将www
计为通配符,这意味着如果我拥有与上述相同的允许域列表,则来自docs.google.com
的请求将被视为有效,因此来自google.com
即使它们不在列表中,但由于www.google.com
存在且www.
是一个主要的通配符,因此两个域都匹配。
实施此操作的最佳方法是什么?这是我的一个片段,我正在尝试实现这个:
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()
我的Domain
模型只有一个字段,名为host
。我的解决方案只有一个数据库命中,但我确定它是最好的还是最有效的。
由于
答案 0 :(得分:0)
首先,如果我想使用通配符,它将不是“www”,因为www只是一个子域。
例如,如果我想让所有google域名记录为“ .google.com ”。 例如,这将显示 www.google.com.au ,因为这是不允许的。您可以将通配符放到最后,但是 google.com.example.com 将被允许,这不是个好主意。或者,您可能希望所有域名以 co.uk 结尾且具有“ .co.uk ”记录的英国网站。
因此,您应该寻找特定于一般的子域:
请勿假设域名为docs.google.co.uk,并且您只有“ .co.uk ”记录。
查询docs.google.co.uk - 检查是否允许使用完整主机名。
在任何通配符定义的情况下查询.docs.google.co.uk
查询.google.co.uk
查询.co.uk - Bingo你找到了一个通配符,它是允许的!
无论如何,在您的代码中,您从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()
我希望它会有所帮助。