2009-03-09 2 views
35

Я начинаю новый проект веб-приложений, используя Django и Pinax. Я хочу, чтобы мои пользователи могли указать уникальные доменные имена, например Wordpress и другие сайты: username.wordpress.com. Я не уверен, как подойти к этому с Django, поскольку логика разбора url (в urls.py) начинается с URL-адреса ПОСЛЕ имени домена.В веб-приложении django, как вы предоставляете пользователям собственный субдомен?

В частности, будет несколько групп пользователей, каждая из которых имеет уникальное имя. Не уверен, что это имеет значение, но я думал, что должен упомянуть об этом.

Есть ли способ манипулировать HTTP-запросом, чтобы URL-адрес выглядел как Django, как если бы URL-адрес был чем-то вроде www.domain.com/groupname, но все же отображался в адресной строке браузера как groupname.domain.com?

+4

Это рассматривается для добавления в Django 1.2: http://code.djangoproject.com/ticket/8896 –

+0

http://github.com/tkaemming/django -subdomains – Daryl

+0

спасибо за сообщение - я обязательно проверю это в следующий раз, когда мне это понадобится (проект, связанный с тем, что этот вопрос был отброшен). –

ответ

24

Вы можете использовать какое-то специальное промежуточное программное обеспечение, чтобы перехватить запрос и получить от него субдомен. Следующий код будет извлекать субдомен и перенаправлять на просмотр по reversing the named url.

Загрузите файл middleware.py в свое приложение.

Убедитесь, что вы создали промежуточное программное обеспечение в файле settings.py.

Убедитесь, что вы назвали ваш взгляд в urls.py

middleware.py

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
import re 

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?') 

class SubdomainMiddleware(object): 
    def process_request(self, request): 
     match = subdomain_pattern.match(request.get_host()) 
     subdomain = match.group('subdomain') 
     redirect_url = reverse('groups_detail', args=[subdomain]) 
     return HttpResponseRedirect(redirect_url) 

urls.py

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    url(r'^groups/(?P<name>.+)/$', 'groups.views.detail', {}, name='group_detail'), 
) 

Примечание: этот код тестировалась.

Перенаправление может изменить внешний вид URL. Если вы хотите этого избежать, просто вызовите связанное представление, запишите его результат и верните его в HttpResponse().

+0

+1: Middleware - лучший способ сделать это, imho. На стороне веб-сервера/DNS необходимо проверить поддомены подстановочных знаков. – Tiago

+0

Звучит неплохо. Не совсем уверен, как изменить путь запроса - действительно ли HttpRequest.build_absolute_uri (местоположение) меняет путь или просто возвращает строку? Я могу изменить атрибут «путь» напрямую, но, по словам docs, «все атрибуты, кроме' session', должны считаться только для чтения. –

+0

Поиск субдомена - это просто часть микса. Если это работает, это звучит как отличное решение, слышал, но не мог ли вы обновить сообщение с кодом, чтобы изменить URL-адрес запроса, чтобы он отражал «реальный» URL-адрес Django? Спасибо (у меня есть сайт с переписыванием, и мне нравится эта возможность намного лучше). –

2

Вам необходимо обработать это через ваш веб-сервер. Если у вас есть Django URLS как ...

/users/<username>/ 

... затем использовать правила перезаписи в веб-сервер для отображения <username>.domain.com в domain.com/users/<username>/.

Если вы используете Apache, вы можете читать here. В противном случае каждый веб-сервер имеет свои собственные соглашения, но все они будут поддерживать понятие перезаписи URL.

+0

Похоже, что это сработает, и есть даже пример «Виртуальные хосты», который очень похож на то, что я хочу. Но я никоим образом не похожа на администратора Apache, и я боюсь положить «логику приложения» в конфигурацию веб-сервера. Также мне придется разрабатывать Apache вместо Django dev-сервера. –

+0

Вы все еще можете разрабатывать на dev-сервере ... просто не указывайте абсолютные URL-адреса в своих шаблонах.Я также ненавижу сбрасывать файлы с помощью Apache conf, но это копирование и вставка. –

+0

Мне любопытно. Как вы думаете, по-вашему, это лучший способ сделать это, чем использовать Middleware? Для меня это немного чище. –

0

this См другой альтернативы конфигурации сервер приложений

Смежные вопросы