Субдомены в django

  • By admin
  • Чт 16 Июнь 2011

На сайте on-day.ru, понадобилось реализовать такую штуку: каждый город должен находиться на своем субдомене. Полезность этого нововведения пусть оценивает СЕО специалист (привет, Евгений!), тут опишу техническую сторону вопроса.

Какие требования:

  1. должна сохраниться легкость управления сайтом;
  2. простота реализации;
  3. при дальнейшем развитии сайта не должно быть проблем, связанных с архитектурой.

Какие варианты реализаций рассматривал:

  1. создать субдомены для каждого города, и для субдомена поставить свой движок сайта;
  2. средствами веб-сервера преобразовывать запросы с subdomain.on-day.ru на on-day.ru/subdomain/
  3. джангу надо научить работать с субдоменами

Достоинства/недостатки:

У первого способа основной недостаток в том, что придется вручную создавать, редактировать и удалять субдомены. То есть научить контент-менеджера работать с панелью управления DNS сервера, настраивать виртуальные хосты на веб-сервере. Достоинство вижу только одно: большая гибкость сайта(-ов).

Во втором способе мне не понравилась жесткая привязка к веб-серверу. То есть, сейчас использую веб-сервер апач. Если захочу заменить веб-сервер на nginx, придется разбираться с настройками преобразования URL-ов.

Как понял дорогой мой читатель, я выбрал третий вариант реализации. Мне нужен готовый модуль с хорошей документацией, поддержкой шаблонных тегов и очень гибкий в настройке. Все, что перепробовал перечислять не буду, я остановился на модуле django-hosts.

Как установить очень хорошо написано в документации. Сейчас я расскажу о его особенностях, вернее о том, что мне было не очевидно. Пусть у нас содержание файла hosts будет таким:

from django.conf import settings
from django_hosts import patterns, host

host_patterns = patterns('',
    host(r'www', settings.ROOT_URLCONF, name='www'),
    host(r'news', 'news.urls', name='news'),
    host(r'(\w+)', 'user.urls', name='user'),
)

а файл user/urls.py будет иметь вот такой код:

from django.conf.urls.defaults import patterns, url

urlpatterns = patterns('user.views',
url(r'^$', 'main_user', name='main_user'),
url(r'^(?P<slug>[^/]+)/$', 'news', name='news'),
)

Формат тега host_url такой: {% host_url название_url параметр1_вьюхи параметр2_вьюхи on название_хоста параметр_хоста1  %} Для примера, нам нужно вывести ссылки на последние новостей всех пользователей. Переменную last_news содержит в себе информацию о последней новости и создателе этой новости. Код шаблона будет таким:

{% load hosts %}

{% for news_item in last_news %}
<a href="{% host_url news news_item.slug on user news.creator.name %}">{{ news.name }}</a>
{% endfor %}

При использовании с пакетом django-debug-toolbar модуль django-hosts вел себя некорректно: не всегда понять какой хост от него требуют. Исправить этот косяк можно только отключив мидлварь debug_toolbar.middleware.DebugToolbarMiddleware. Об этом поведении отписался на своем недоанглийском разработчику. Если кто владеет английским гораздо лучше меня и объяснит автору что я имел ввиду, то буду очень признателен