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

Entradas sobre "decorators":

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 d Noviembre d 2008 | 3 comentarios | Categorías: decorators, snippets