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
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