В веб-приложении 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 urls, как...

/users/<username>/

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

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


посмотреть этой другая альтернативная настройка appserver