SlideShare a Scribd company logo
1 of 13
Мульти-доменность
 в Django проекте
         Специально для
    MoscowDjango Meetup #7
 by Alexey Kinyov rudy@05bit.com
Кто докладывает
• Алексей Кинёв, 30 лет, Москва, тех.
  директор в компании КСАН
• Опыт разработки на Python/Django 4 года
• Проекты:
  – PCNews.ru, Qmazi.com, Gallerza.com
  – django-smarter
• Home page:
  – http://05bit.com/rudyryk/
Проблема / задача
Single domain:
http://domain.com/<blog>/<post>/

Multi domain:
http://<blog>.domain.com/<post>/

          Single domain => Multi domain
Варианты решения
• django.contrib.sites
  – стандартно, но не то: 1 домен  1 settings.SITE_ID
• использовать Middleware
  –звучит разумно
• использовать свой DNS / BIND
  –«бесплатно» + полный контроль, но рискованно,
  сложно
• использовать сторонний DNS SAS с API
  –проще, но за деньги
Выбранное решение

  Делаем Middleware
   + PowerDNS.com

BEST PRACTICE? Not sure.
      Just works 
Пикантные подробности
Пример models.py:

class Channel(models.Model):
    slug = models.CharField(max_length=100, unique=True)
    title = models.CharField(max_length=200)
    # ...

class Post(models.Model):
    channel = models.ForeignKey(Channel)
    # ...
Пикантные подробности
Пример urls.py

urlpatterns = ('',

    # host based views
    url(r'^~/(?P<host>[^/]+)/$',
        channel_view),
    url(r'^~/(?P<host>[^/]+)/post/(?P<pk>d+)/$',
        post_view),
    # ...
)
Пикантные подробности
Пример views.py:

def post_view(request, host, pk):
    # get 'myblog' of 'myblog.qmazi.com'
    slug = host.split('.', 1)[0]
    post = get_objects_or_404(Post, channel__slug=slug, pk=pk)
    return render(request, 'channel/post.html', {'post': post})



                         host            pk
http://qmazi.com/~/myblog.qmazi.com/post/20/
Пикантные подробности
The trick: подменяем request.path_info


class MultiHostMiddleware(object):
    def process_request(self, request):
        # settings.SITE_HOST = 'domain.com’ # main domain
        if request.get_host() != settings.SITE_HOST:
               request.path = '/~/%s/%s' % (
                   request.get_host(),
                   request.path.lstrip('/'))
               request.path_info = request.path
Profit 
http://myblog.qmazi.com/post/20/



/~/myblog.qmazi.com/post/20/



post_view
Слабые места
1. Нельзя использовать reverse для
   генерации host-based адресов

2. Усложнение views

Решается адекватным набором utils.
Развитие решения
«Прячем» служебные url’ы:
def post_view(request, host, pk):
    if not settings.DEBUG_HOSTS:
        if host != request.get_host():
            raise Http404
    # ...


Подключаем любой домен:
def post_view(request, host, pk):
    # ...
    channel = get_channel_by_host(host) # my utils
    post = get_objects_or_404(Post, channel=channel, pk=pk)
    # ...
Спасибо!

Вопросы?

More Related Content

What's hot

Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
 
Chef коротко об инфраструктуре
Chef коротко об инфраструктуреChef коротко об инфраструктуре
Chef коротко об инфраструктуреAndrey Subbota
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиKirill Mokevnin
 
Psgi app
Psgi appPsgi app
Psgi appund3f
 
Дмитрий Милых «Деплой Django-проекта с помощью Fabric»
Дмитрий Милых «Деплой Django-проекта с помощью Fabric»Дмитрий Милых «Деплой Django-проекта с помощью Fabric»
Дмитрий Милых «Деплой Django-проекта с помощью Fabric»DataArt
 

What's hot (11)

Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Chef коротко об инфраструктуре
Chef коротко об инфраструктуреChef коротко об инфраструктуре
Chef коротко об инфраструктуре
 
Chef
ChefChef
Chef
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статики
 
Comma
CommaComma
Comma
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Psgi app
Psgi appPsgi app
Psgi app
 
Парсер: что? зачем? как?
Парсер: что? зачем? как?Парсер: что? зачем? как?
Парсер: что? зачем? как?
 
Дмитрий Милых «Деплой Django-проекта с помощью Fabric»
Дмитрий Милых «Деплой Django-проекта с помощью Fabric»Дмитрий Милых «Деплой Django-проекта с помощью Fabric»
Дмитрий Милых «Деплой Django-проекта с помощью Fabric»
 
Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 

Viewers also liked (20)

Mónica Almeida (FT1)
Mónica Almeida (FT1)Mónica Almeida (FT1)
Mónica Almeida (FT1)
 
Panduan o oo-math-3-0_revisi1
Panduan o oo-math-3-0_revisi1Panduan o oo-math-3-0_revisi1
Panduan o oo-math-3-0_revisi1
 
6 Artes ii
6   Artes ii6   Artes ii
6 Artes ii
 
Medical data mining applications
Medical data mining applicationsMedical data mining applications
Medical data mining applications
 
PELICULAS
PELICULASPELICULAS
PELICULAS
 
Kode Etik Kemanusiaan
Kode Etik KemanusiaanKode Etik Kemanusiaan
Kode Etik Kemanusiaan
 
Dra IsisToledo
Dra IsisToledo Dra IsisToledo
Dra IsisToledo
 
Controles basicos final
Controles basicos finalControles basicos final
Controles basicos final
 
Can ho resort ven sông 5 sao
Can ho resort ven sông 5 saoCan ho resort ven sông 5 sao
Can ho resort ven sông 5 sao
 
Health Chase Systems
Health Chase SystemsHealth Chase Systems
Health Chase Systems
 
Titulación 2009
Titulación 2009Titulación 2009
Titulación 2009
 
2
22
2
 
Śniadanie Daje Moc
Śniadanie Daje MocŚniadanie Daje Moc
Śniadanie Daje Moc
 
La comunicazione di impresa in romagna
La comunicazione di impresa in romagnaLa comunicazione di impresa in romagna
La comunicazione di impresa in romagna
 
Los navegadores
Los navegadoresLos navegadores
Los navegadores
 
Turismo na Copa do Mundo
Turismo na Copa do MundoTurismo na Copa do Mundo
Turismo na Copa do Mundo
 
Onde estão as minhas citações: ferramentas e dicas
Onde estão as minhas citações: ferramentas e dicasOnde estão as minhas citações: ferramentas e dicas
Onde estão as minhas citações: ferramentas e dicas
 
Půdní+katéna
Půdní+katénaPůdní+katéna
Půdní+katéna
 
ъ 1.4. с 1. к 2
ъ 1.4. с 1. к 2ъ 1.4. с 1. к 2
ъ 1.4. с 1. к 2
 
Embedded Sytem and Its Characteristic
Embedded Sytem and Its CharacteristicEmbedded Sytem and Its Characteristic
Embedded Sytem and Its Characteristic
 

Similar to Мульти-доменность в Django проекте

Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаprivate_face
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаIlya Chesnokov
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkOleksandr Torosh
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)7bits
 
Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.Sphere Consulting Inc
 
Building better APIs on rails
Building better APIs on railsBuilding better APIs on rails
Building better APIs on railsRoman Gorel
 

Similar to Мульти-доменность в Django проекте (20)

Mojolicious
MojoliciousMojolicious
Mojolicious
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кода
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервиса
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
176023
176023176023
176023
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Yserver
YserverYserver
Yserver
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.
 
Building better APIs on rails
Building better APIs on railsBuilding better APIs on rails
Building better APIs on rails
 

Мульти-доменность в Django проекте