Djangoic метод проверки, является ли это разрешенным поддоменом - PullRequest
1 голос
/ 10 октября 2011

Мне нужно решить эту маленькую проблему в 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.Это моё решение сделало всего один удар по БД, но я уверен, что оно лучшее или самое эффективное.

Спасибо

1 Ответ

0 голосов
/ 10 октября 2011

Прежде всего, если я хотел бы использовать подстановочный знак, это не будет "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 - Бинго, вы нашли подстановочный знак, это разрешено!

В любом случае, в вашем коде вы выбираете все доменные объекты издБ, а затем ищет подходящее доменное имя с циклом.Эта операция излишне замедлит ваш процесс.Вместо того, чтобы выбирать их все, вы должны позволить базе данных обработать удаление несвязанных доменов.

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()

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...