En ocasiones nos interesa trabajar con subdominios en nuestros proyectos Django. Para ello podemos utilizar un sencillo middleware para subdominios que podemos encontrar en djangosnippets. Basta con guardarlo en nuestro proyecto e incluirlo en la lista MIDDLEWARE_CLASSES de nuestro settings.py. De esta forma tendremos el subdominio de la petición en la variable subdomain del objeto request.
El problema al trabajar con subdominios es que las sesiones iniciadas en un subdominio no se mantienen cuando se cambia a otro. Para poder mantener activas las sesiones entre subdominios tenemos que añadir la siguiente línea al settings.py de nuestro proyecto:
SESSION_COOKIE_DOMAIN = '.mi-dominio.com'
De esta forma la cookie de sesión que se almacena en el navegador valdrá para todos los subdominios.
Si por ejemplo queremos dar un subdominio a cada usuario de nuestro proyecto podemos modificar el middleware para que busque el usuario adecuado y lo incluya en el objeto request. El middleware quedaría de la siguiente manera:
from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
class SubdomainMiddleware:
""" Make the subdomain publicly available to classes """
def process_request(self, request):
domain_parts = request.get_host().split('.')
if (len(domain_parts) > 2):
subdomain = domain_parts[0]
if (subdomain.lower() == 'www'):
subdomain = ''
domain = '.'.join(domain_parts[1:])
else:
subdomain = ''
domain = request.META['HTTP_HOST']
request.subdomain = subdomain
request.domain = domain
if subdomain != 'www' and subdomain != '':
# Buscamos el usuario del subdominio
try:
request.usuario_subdominio = User.objects.filter(username=subdomain)
except ObjectDoesNotExist:
raise Http404
De esta forma el usuario correspondiente al subdominio que se visita está disponible en la variable usuario_subdominio del objeto request. Si utilizamos variables de contexto y tenemos 'django.core.context_processors.request' en la lista de procesadores de contexto (setting TEMPLATE_CONTEXT_PROCESSORS) podemos obtener el usuario actual en nuestras plantillas mediante:
{{ request.usuario_subdominio }}
Publicado por Antonio Melé el Domingo 2 d Agosto d 2009
Compártelo:
| Categorías:
middleware,
snippets,
trucos,
urls
Este snippet reemplaza la funcionalidad del templatetag {% if %} permitiendo realizar comparaciones con operadores >, <, >=, <=, != además de las comparaciones que permite hacer {% if %} por defecto. Por ...
Saber si nuestro visitante viene de un buscador es interesante en varios casos. Por ejemplo para almacenar el término de búsqueda que le ha ...
Los templatetags de Django son a nivel de aplicación. Sin embargo a veces nos gustaría que distintas aplicaciones compartieran templatetags ó evitarnos tener que ...
Una de las cosas que los buscadores tienen en cuenta para establecer la relevancia de sus resultados son las palabras que aparecen en las ...
Pero no es necesario usar vistas genéricas o añadir un RequestContext para usar las variables desde los templates?
Arkanus, gracias por comentarlo. A eso me refiero con utilizar variables de contexto pero para dejarlo más claro un ejemplo de utilización de variables de contexto sería:
from django.template import RequestContext
from django.shortcuts import render_to_response
def mi_vista(request):
# ...
return render_to_response('pagina.html', context_instance=RequestContext(request))
Ok, pensé que había una forma automágica de incluir el RequestContext que no conocía.
Gracias por la aclaración
Tambien:
Usar
request.urlconf = 'project.app.urls'
en Middleware para urls solo esto subdominio
este ejemplo tiene como inconveniente que no funciona el dominios que no tengan 2 niveles, por ejemplo,
algo que pudiese resolver esto pudiera ser obtener el subdominio a partir del current_site, y asi quedaria mas generico. de hecho ya el current_site contendria el dominio.
site = Site.objects.get_current() pattern = r'^(?:(?P.*?)\.)?%s(?::.*)?$' % re.escape(site.domain) matches = re.match(pattern, request.get_host()) if matches: request.subdomain = matches.group('subdomain') else: request.subdomain = None
con el animo de contribuir con este valioso sitio
pd: basado en el pluggable django-subdomain
Suscríbete a nuestro feed RSS y al feed de la comunidad para estar al tanto de todo lo que ocurre entorno a Django.
Tú también puedes escribir en éste blog. Para hacerlo basta con que nos digas sobre qué quieres escribir un artículo relacionado con Django.
Utilizar un formulario para modificar 2 modelos
Descubriendo objetos similares por sus etiquetas