2009-03-09 13 views
35

Zaczynam nowy projekt aplikacji internetowej za pomocą Django i Pinax. Chcę móc przekazywać użytkownikom unikalne nazwy domen, takie jak Wordpress i inne witryny: username.wordpress.com. Nie jestem pewien, jak podejść do tego z Django, ponieważ logika parsowania adresu URL (w urls.py) zaczyna się od adresu URL po nazwie domeny.W aplikacji internetowej django, w jaki sposób dajesz użytkownikom własną subdomenę?

Dokładniej, będzie wiele grup użytkowników, każda grupa ma unikalną nazwę. Nie jestem pewien, czy to ma znaczenie, ale pomyślałem, że powinienem o tym wspomnieć.

Czy jest jakiś sposób mogę manipulować żądania HTTP tak, że adres URL wygląda Django jakby url było coś www.domain.com/groupname, ale pokazał w pasku adresu przeglądarki jako groupname.domain.com?

+4

ten jest uważany za Ponadto w Django 1.2: http://code.djangoproject.com/ticket/8896 –

+0

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

+0

dziękuję za publikację - na pewno to sprawdzę następnym razem, kiedy tego potrzebuję (projekt, w którym to pytanie było związane z tym, co zostało usunięte). –

Odpowiedz

24

Możesz użyć niestandardowego oprogramowania pośredniego, aby przechwycić żądanie i uzyskać z niego subdomenę. Poniższy kod pobierze subdomenę i przekieruje do widoku przez reversing the named url.

Umieść go w pliku middleware.py w swojej aplikacji.

Upewnij się, że skonfigurowałeś oprogramowanie pośredniczące w pliku settings.py.

Upewnij się, że Twój widok nazwany w 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'), 
) 

Uwaga: kod ten jest niesprawdzony.

Przekierowanie może zmienić wygląd adresu URL. Jeśli chcesz tego uniknąć, po prostu wywołaj powiązany widok, przechwyć jego wynik i zwróć go w postaci HttpResponse().

+0

+1: Middleware to najlepszy sposób na zrobienie tego, imho. Po stronie serwera/dns, sprawdź subdomenię wieloznaczną. – Tiago

+0

To brzmi dobrze. Nie do końca pewna, jak zmienić ścieżkę żądania - czy HttpRequest.build_absolute_uri (lokalizacja) faktycznie zmienia ścieżkę, czy po prostu zwraca ciąg znaków? Mogę zmienić atrybut "ścieżka" bezpośrednio, ale docs mówią, że "wszystkie atrybuty poza' sesją' powinny być uważane za tylko do odczytu. –

+0

Znalezienie subdomeny to tylko część miksu. Jeśli to działa, to brzmi jak świetne rozwiązanie, którego nie miałem. słyszał o, ale czy możesz zaktualizować post z kodem, aby zmienić adres URL żądania, tak aby odzwierciedlał "prawdziwy" URL Django? dzięki (mam stronę z przeróbkami i bardzo mi się podoba ta możliwość) –

2

Musisz poradzić sobie z tym za pośrednictwem swojego serwera WWW. Jeśli masz Django adresy URL jak ...

/users/<username>/ 

... następnie użyć reguły przepisywania na serwerze internetowym do map <username>.domain.com do domain.com/users/<username>/.

Jeśli używasz Apache, możesz przeczytać here. W przeciwnym razie każdy serwer ma swoje własne konwencje, ale wszystkie będą obsługiwać przepisywanie adresów URL.

+0

To brzmi, jakby działało, a jest nawet przykład "Virtual Hosts", który jest bardzo podobny do tego, co chcę. Ale w żaden sposób nie przypominam administratora Apache i obawiam się umieszczania "logiki aplikacji" w konfiguracji serwera WWW. Musiałbym też rozwijać się na Apache zamiast na serwerze Django. –

+0

Nadal możesz się rozwijać na serwerze dev ... po prostu nie wskaż absolutnych adresów URL w szablonach.Nienawidzę też putowania za pomocą plików conf Apache, ale jest to praca polegająca na kopiowaniu i wklejaniu. –

+0

Jestem ciekawy. Czy Twoim zdaniem jest to lepszy sposób na to niż korzystanie z oprogramowania pośredniego? Czuję się dla mnie trochę czystszy. –