В веб-приложении django как вы предоставляете пользователям свой собственный поддомен?

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

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

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

3 ответа

Решение

Вы можете использовать какое-то пользовательское промежуточное программное обеспечение для перехвата запроса и получения с него субдомена. Следующий код извлечет поддомен и перенаправит на представление путем обращения именованного 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(),

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

/users/<username>/

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

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

Посмотрите эту другую альтернативу настройки сервера приложений

Другие вопросы по тегам