Python 检查它是否是允许的子域的Djangoic方法

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

我必须用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()
我的域模型只有一个字段,称为主机。我的这个解决方案只命中一分贝,但我确定它是最好的还是最有效的


谢谢

首先,如果我想使用通配符,它将不是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存储在您允许的网站列表中?