astrikovd
@astrikovd
Python Developer

Возможно ли динамическое создание urlpatterns в django?

Проблема такая: есть сервис, где пользователи могут создавать свои сайты. Каждый сайт доступен по доменному имени вида site1.app.com, site2.app.com и т.д. Пользователи могут создавать произвольные страницы с произвольными URL на своих сайтах.

Я хочу в зависимости от того, на какой субдомен пришел запрос, динамически создавать схему роутинга в моем приложении. Т.е. грубо говоря мне надо понять на какой субдомен пришел запрос, вытащить все страницы, созданные для этого субсайта, из базы данных и создать urlpatterns согласно этим страницам.

Такое вообще возможно, или копать в сторону одного универсального view-роутера?
  • Вопрос задан
  • 3324 просмотра
Решения вопроса 2
stepank
@stepank
Похоже, что в вашем случае достаточно создать url pattern такого вида:

urlpatterns = patterns('',
    ...
    url(r'^pages/(.*)', page_dispatcer),
)


У обработчика будут такие аргументы:

def page_dispatcher(request, path):
    ...


Далее в page_dispatcher нужно смотреть request.META['HTTP_HOST'], чтобы получить доменное имя, откуда выковырять субдомен. По субдомену найти страницы нужного пользователя и дальше по path выбрать нужную.

Могу предположить, что набор страниц для пользователя меняется не очень часто, поэтому, конечно, не желательно на каждый запрос лезть в базу за списоком страниц. Чтобы этого избежать, результаты запроса можно кешировать. Как именно это сделать, зависит от вашего проекта.
Ответ написан
astrikovd
@astrikovd Автор вопроса
Python Developer
Попробовал сделать следующим образом:

class DynamicURLConf(object):
    urlpatterns = None

    def __init__(self, pages):
        self.urlpatterns = patterns('',
                                    url(r'^$', 'app.account.site.views.test'),
                                    url(r'^test/$', 'app.account.site.views.test'),
        )


def page_dispatcher(request, path):
    func, args, kwargs = resolve(urlparse("/" + path + "/")[2], DynamicURLConf(pages=None))
    kwargs['request'] = request
    return func(*args, **kwargs)


def test(request):
    return HttpResponse("I am test")


В итоге получаю странную ошибку:

Using the URLconf defined in app.account.site.urls, Django tried these URL patterns, in this order:
^$
^test/$
The current URL, test/, didn't match any of these.


Ведь второй паттерн подходит...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы