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 Sunday 2 de August de 2009 | 4 comentarios | Categorías: middleware, snippets, trucos, urls
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 llevado a nuestro sitio web o desde qué buscador ha llegado para nutrir nuestras estadísticas. También nos sirve para destacar en nuestro sitio los términos de búsqueda sobre el resto del texto, facilitando que el usuario identifique rápidamente los fragmentos de información que le interesan.
En otras ocasiones queremos mostrar anuncios sólo a quienes llegan a nuestro sitio desde un buscador para favorecer a nuestros visitantes habituales mostrándoles nuestra web sin anuncios (quienes entran directamente escribiendo nuestra URL en su navegador). Lo que por otro lado también nos ayuda generalmente a aumentar nuestro CTR, ya que nuestros visitantes habituales suelen hacer menos caso a la publicidad de nuestro sitio web.
Este middleware te permite saber si el usuario proviene de un buscador y en tal caso acceder a la información de búsqueda: de qué buscador proviene y qué términos ha utilizado para la búsqueda. Para hacerlo funcionar debemos añadirlo a nuestro setting MIDDLEWARE_CLASSES. Con esto podremos acceder desde nuestras vistas a request.search_referrer_engine (nombre del buscador), request.search_referrer_domain (dominio del buscador) y request.search_referrer_term (término buscado).
Para poder acceder al objeto request desde nuestras plantillas debemos asegurarnos de que tenemos 'django.core.context_processors.request' en nuestro setting TEMPLATE_CONTEXT_PROCESSORS y que al cargar nuestras plantillas desde nuestras vistas utilizando render_to_response les pasamos RequestContext de la siguiente manera:
from django.template import RequestContext
from django.shortcuts import render_to_response
def mi_vista(request):
# ...
return render_to_response('my_template.html', mi_diccionario_de_datos, context_instance=RequestContext(request))
De esta manera hacemos disponibles las variables de contexto en nuestras plantillas. Nota: Las vistas genéricas (generic views) utilizan RequestContext siempre.
Ahora podremos acceder desde nuestras plantillas a la información por ejemplo para mostrar anuncios sólo a los visitantes que provienen de buscadores:
{% if request.search_referrer_engine %}
<div class="anuncios"> ... </div>
{% endif %}
Publicado por Antonio Melé el Monday 22 de December de 2008 | 0 comentarios | Categorías: middleware, snippets
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