Как заставить Django url диспетчер использовать поддомен? - PullRequest
4 голосов
/ 30 июня 2010

У меня есть смутное представление о том, как решить эту проблему, но мне действительно нужен толчок:)

У меня есть приложение Django, работающее с Apache (mod_wsgi). Сегодня URL выглядят так: http://site.com/category/A/product/B/

Я бы хотел сделать следующее: http://A.site.com/product/B

Это означает, что диспетчер url должен каким-то образом подобрать значение, найденное в поддомене, и понять контекст этого, а не только смотреть на путь. Я вижу два подхода:

  • Используйте .htaccess и переписываете так, чтобы a.site.com был переписать . Не уверен, что сработает, потому что я не до конца понимаю, что увидит в этом случае структура диспетчера URL django?
  • Понимая, как работает диспетчер URL, я мог бы написать фильтр, который просматривает действительные поддомены и предоставляет его в переписанном формате для кода диспетчера URL.

Любые советы или решения очень ценятся! Спасибо.

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Решение Mikes является правильным, если вы хотите иметь несколько сайтов с одинаковыми приложениями с различным содержимым (модуль сайтов) на нескольких доменах или поддоменах, но у него есть недостаток, заключающийся в том, что вам нужно запускать несколько экземпляров процесса Django.

Лучшим решением основной проблемы, связанной с несколькими доменами или поддоменами, является использование простого промежуточного программного обеспечения, которое обрабатывает входящие запросы с помощью функции process_request() и изменения задокументированного атрибута urlconf ( ссылка ) запросите объект для URLconf, который вы хотите использовать.

Более подробную информацию и пример диспетчера URL для каждого запроса или домена можно найти по адресу: http://gw.tnode.com/0483-Django/

1 голос
/ 30 июня 2010

Вы смотрели на django.contrib.sites?Я думаю, что комбинация этого, установка SITE_ID в вашем settings.py и наличие одного WSGI-файла на «сайт», может позаботиться обо всем.

РЕДАКТИРОВАТЬ: -v set.

django.contrib.sites позволяет вам запускать несколько сайтов из одного проекта и базы данных Django.Он добавляет таблицу (django.contrib.sites.models.Site) с полями domain и name.Из того, что я могу сказать, name может означать все, что вы хотите, но обычно это английское название сайта.domain - это то, что должно отображаться в основной части URL.

SITE_ID устанавливается в settings.py на id обслуживаемого сайта.В исходном файле settings.py он равен 1 (без комментариев).Вы можете заменить это любым кодом, который вам нужен, чтобы установить правильное значение.

Очевидная вещь, которую нужно сделать, это проверить переменную окружения и найти ее в поле name или domain.в таблице Site, но я не уверен, что это будет работать из файла settings.py, так как этот файл устанавливает параметры подключения к базе данных (круговая зависимость?).Поэтому вам, вероятно, придется согласиться на что-то вроде:

SITE_ID = int(os.environ.get('SITE_ID', 1)

Затем в своем файле WSGI вы делаете что-то вроде:

os.environ['SITE_ID'] = 2

и устанавливаете это последнее число на соответствующее значение,Вам понадобится один файл WSGI для каждого сайта, или, возможно, есть способ установить SITE_ID в настройках Apache.Какой путь выбрать, зависит от настройки сайта.

Каркас сайтов наиболее эффективен, когда вы используете Site в качестве цели ForeignKey или ManyToManyField, так что вы можете связать экземпляры модели(т.е. записи) на конкретные сайты.

0 голосов
/ 30 июня 2010

Попробуйте добавить субдомен подстановочного знака: обычно *.

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