2009-03-09 4 views
35

Sto avviando un nuovo progetto di app Web utilizzando Django e Pinax. Voglio essere in grado di fornire ai miei utenti nomi di dominio unici come Wordpress e altri siti: username.wordpress.com. Non sono sicuro di come affrontarlo con Django, dal momento che la logica di analisi url (in urls.py) inizia con l'URL DOPO il nome di dominio.In un'applicazione web django, come concedi agli utenti il ​​proprio sottodominio?

In particolare, ci saranno più gruppi di utenti, ciascun gruppo con un nome univoco. Non sono sicuro che faccia la differenza, ma ho pensato di doverlo dire.

C'è un modo per manipolare la richiesta http in modo che l'URL guardi a Django come se l'url fosse qualcosa come www.domain.com/groupname, ma ancora visualizzato nella barra degli indirizzi del browser come groupname.domain.com?

+4

Questa viene presa in considerazione per l'aggiunta in Django 1.2: http://code.djangoproject.com/ticket/8896 –

+0

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

+0

thanks for posting - Verificherò sicuramente questo aspetto la prossima volta che ne ho bisogno (progetto a cui questa domanda era correlata per essere lasciata cadere). –

risposta

24

È possibile utilizzare alcuni middleware personalizzati per intercettare la richiesta e ottenere il sottodominio da esso. Il seguente codice recupererà il sottodominio e reindirizzerà a una vista da reversing the named url.

Inseriscilo in un file middleware.py nella tua app.

Assicurarsi di impostare il middleware nel file settings.py.

Assicurati di aver chiamato il vostro vista in 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'), 
) 

Nota: Questo codice è non testato.

Il reindirizzamento può modificare l'aspetto dell'URL. Se vuoi evitare questo, chiama semplicemente la vista associata, cattura il suo risultato e restituiscilo in un HttpResponse().

+0

+1: il middleware è il modo migliore per farlo, imho. Sul lato webserver/dns, controllare i sottodomini dei caratteri jolly. – Tiago

+0

Sembra buono. Non è del tutto sicuro su come modificare il percorso della richiesta: HttpRequest.build_absolute_uri (posizione) modifica effettivamente il percorso o restituisce semplicemente una stringa? Potrei cambiare l'attributo 'path' direttamente, ma i documenti dicono "tutti gli attributi tranne' session' dovrebbero essere considerati di sola lettura –

+0

Trovare il sottodominio è solo una parte del mix. Se funziona, sembra un'ottima soluzione che non ho sentito, ma potresti aggiornare il post con il codice per cambiare l'url della richiesta in modo che rifletta il "vero" URL di Django? grazie (ho un sito con riscritture e questa possibilità mi piace molto di più) –

2

È necessario gestirlo tramite il server web. Se si dispone di Django URL come ...

/users/<username>/ 

... quindi utilizzare regole di riscrittura del server web per mappare <username>.domain.com-domain.com/users/<username>/.

Se si utilizza Apache, è possibile leggere here. In caso contrario, ogni server Web ha le proprie convenzioni, ma tutto supporterà la nozione di riscrittura di URL.

+0

Sembra che funzioni, e c'è persino un esempio di "host virtuali" che è molto simile a quello che voglio. Ma non assomiglio in alcun modo ad un amministratore Apache, e ho paura di mettere la "logica dell'applicazione" nella configurazione del server web. Inoltre dovrei sviluppare su Apache al posto del server di sviluppo Django. –

+0

È ancora possibile sviluppare sul server di sviluppo ... semplicemente non puntare agli URL assoluti nei modelli.Odio anche pungere con i file di conf Apache, ma è un lavoro di copia e incolla. –

+0

Sono curioso. Secondo la tua opinione, questo è un modo migliore di farlo rispetto all'utilizzo di Middleware? Mi sembra un po 'più pulito. –

0

Vedi this altra alternativa la configurazione del server delle applicazioni

Problemi correlati