Django es el entorno de desarrollo web para perfeccionistas con límites de tiempo

Entradas sobre "snippets":

Middleware para detectar visitas desde buscadores

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 Lunes 22 de Diciembre de 2008 | 0 comentarios | Categorías: middleware, snippets

Decorator para nuestras vistas AJAX

Vamos a ver un sencillo snippet de código que nos va a permitir limitar las peticiones a las vistas que queramos a peticiones AJAX. La mayoría de las librerías JavaScript (jQuery, Prototype, Dojo, Mootools, YUI, etc.) envían en sus peticiones HTTP el header HTTP_X_REQUESTED_WITH con el valor XMLHttpRequest. El objeto HttpRequest de Django incorpora el método is_ajax() que chequea el valor del header HTTP_X_REQUESTED_WITH para devolver True en caso de que la petición se haya realizado de este modo. El siguiente decorator utiliza request.is_ajax() y devuelve un error 400 (Bad Request) si la petición no es una petición AJAX:

from django.http import HttpResponseBadRequest

def ajax_required(f):
    def wrap(request, *args, **kwargs):
        if not request.is_ajax():
            return HttpResponseBadRequest
        return f(request, *args, **kwargs)
    wrap.__doc__=f.__doc__
    wrap.__name__=f.__name__
    return wrap

Ejemplo de uso:

@ajax_required
def mi_vista(request):
    # ...

El snippet también está publicado en djangosnippets.org. Por supuesto, esto decorator no impide que alguien pueda hacer peticiones a las vistas en las que lo utilicemos incluyendo a propósito dicho header pero es una buena manera de limitar el acceso público a ellas.

Publicado por Antonio Melé el Viernes 28 de Noviembre de 2008 | 0 comentarios | Categorías: decorators, snippets