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

时间:2011-10-10 08:06:24

标签: python django

我必须在Python / Django中解决这个小问题,我想知道哪个是最好的方法。

我有一个允许的域列表,例如www.google.commail.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。我的解决方案只有一个数据库命中,但我确定它是最好的还是最有效的。

由于

1 个答案:

答案 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 ”记录。

  1. 查询docs.google.co.uk - 检查是否允许使用完整主机名。

  2. 在任何通配符定义的情况下查询.docs.google.co.uk

  3. 查询.google.co.uk

  4. 查询.co.uk - Bingo你找到了一个通配符,它​​是允许的!

  5. 无论如何,在您的代码中,您从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()
    

    我希望它会有所帮助。