2009-03-09 15 views
35

Estoy comenzando un nuevo proyecto de aplicación web usando Django y Pinax. Quiero poder darles a mis usuarios nombres de dominio únicos como Wordpress y otros sitios: username.wordpress.com. No estoy seguro de cómo abordar esto con Django, ya que la lógica de análisis de URL (en urls.py) comienza con la URL DESPUÉS del nombre de dominio.En una aplicación web django, ¿cómo le das a los usuarios su propio subdominio?

Más específicamente, habrá múltiples grupos de usuarios, cada grupo tendrá un nombre único. No estoy seguro de que eso marque la diferencia, pero pensé que debería mencionar eso.

¿Hay alguna manera en que pueda manipular la solicitud http para que la URL mire a Django como si la url fuera algo así como www.domain.com/groupname, pero aún se mostrara en la barra de direcciones del navegador como groupname.domain.com?

+4

Este está siendo considerado para la adición en Django 1.2: http://code.djangoproject.com/ticket/8896 –

+0

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

+0

gracias por publicarlo. Definitivamente veré esto la próxima vez que lo necesite (se eliminó el proyecto del que se trataba esta pregunta). –

Respuesta

24

Puede usar algún middleware personalizado para interceptar la solicitud y obtener el subdominio de ella. El siguiente código recuperará el subdominio y lo redireccionará a una vista por reversing the named url.

Ponlo en un archivo middleware.py en tu aplicación.

Asegúrese de configurar el middleware en su archivo settings.py.

Asegúrese de que ha asignado el nombre de vista en 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: Este código se no probado.

El redireccionamiento puede alterar el aspecto de la URL. Si desea evitar esto, simplemente llame a la vista asociada, capture su resultado y regréselo en un HttpResponse().

+0

+1: Middleware es la mejor manera de hacerlo, imho. En el lado del servidor web/dns, busca los subdominios de comodines. – Tiago

+0

Esto suena bien. No estoy del todo seguro de cómo cambiar la ruta de la solicitud: ¿HttpRequest.build_absolute_uri (ubicación) realmente cambia la ruta, o simplemente devuelve una cadena? Podría cambiar el atributo 'ruta' directamente, pero los documentos dicen que "todos los atributos excepto' sesión 'deben considerarse de solo lectura. –

+0

Encontrar el subdominio es solo parte de la mezcla. Si esto funciona, parece una gran solución que no tengo oído hablar, pero ¿podría actualizar la publicación con el código para cambiar la URL de solicitud para que refleje la url "real" de Django? gracias (tengo un sitio con reescrituras y me gusta mucho esta posibilidad). –

2

Debe manejar esto a través de su servidor web. Si tiene Django URLs como ...

/users/<username>/ 

... a continuación, utilizar las reglas de reescritura en el servidor web para mapear <username>.domain.com a domain.com/users/<username>/.

Si está utilizando Apache, puede leer here. De lo contrario, cada servidor web tiene sus propias convenciones, pero todas respaldarán la noción de reescrituras de URL.

+0

Parece que funcionaría, e incluso hay un ejemplo de "Hosts Virtuales" que es bastante similar a lo que quiero. Pero de ninguna manera me asemejo a un administrador Apache, y tengo miedo de poner 'lógica de aplicación' en la configuración del servidor web. También tendría que desarrollar en Apache en lugar del servidor de desarrollo de Django. –

+0

Aún puede desarrollar en el servidor de desarrollo ... simplemente no apunte a URL absolutas en sus plantillas.También odio putzing con archivos conf de Apache, pero es un trabajo de copiar y pegar. –

+0

Tengo curiosidad. En su opinión, ¿cree que esta es una mejor manera de hacerlo que usar Middleware? Se siente un poco más limpio para mí. –

0

Ver otras this alternativa la configuración del servidor de aplicaciones

Cuestiones relacionadas