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

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

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

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

Ответы [ 3 ]

24 голосов
/ 09 марта 2009

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

2 голосов
/ 09 марта 2009

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

/users/<username>/

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

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

0 голосов
/ 13 августа 2009

См. этот другой альтернативный способ настройки сервера приложений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...