Cachear una vista django que tenga parámetros de URL

Recientemente he implementado el excelente marco de caché de Django. Sin embargo, por lo que entiendo, Django no almacenará en caché una vista que haya pasado parámetros en una solicitud de obtención. Tengo una vista Ajax que se pasa, obtenga parámetros que me gustaría almacenar en la memoria caché durante X segundos, ¿cuál sería una forma fácil de hacer esto?

En el código psuedo actualmente tengo una URL:

http://mysites/ajaxthing/?user=foo&items=10 

Me gustaría almacenar en caché esta URL siempre que tenga los mismos parámetros de obtención.

Actualmente estoy usando los decoradores de caché en mi opinión:

 myview(stuff) myview = cache_page(myview, 60 * 3) 

Leí acerca de los diferentes encabezados de django pero pasé un poco por encima de mi cabeza, y ni siquiera estoy seguro de que sea la solución correcta.

Correcto, variar los encabezados no es la solución correcta, se usa cuando se quiere almacenar en caché en función de los encabezados de solicitud del cliente como agente de usuario, etc.

Tendrá que usar la API de bajo nivel o el almacenamiento en caché de fragmentos de plantillas . Depende de tus puntos de vista realmente.

Con API de bajo nivel se ve algo como esto:

 from django.core.cache import cache def get_user(request): user_id = request.GET.get("user_id") user = cache.get("user_id_%s"%user_id) if user is None: user = User.objects.get(pk=user_id) cache.set("user_id_%s"%user_id, user, 10*60) # 10 minutes ... .. . 

Sí, puedes usar django-view-cache-utils, aquí está el código para tu caso:

 from view_cache_utils import cache_page_with_prefix from django.utils.hashcompat import md5_constructor ... @cache_page_with_prefix(60*15, lambda request: md5_constructor(request.get_full_path()).hexdigest()) def my_view(request): ... 

Esto ya no debería ser un problema en Django 1.3+. Consulte: https://docs.djangoproject.com/en/dev/topics/cache/#using-vary-headers

Parece que ya no necesita hacer nada más complicado que colocar @cache_page ([cantidad de tiempo]) sobre su función de vista que está intentando almacenar en caché, independientemente de si tiene parámetros en la URL.

Por ejemplo, si tienes una URL como:

 http://example.com/user/some_user_id 

Su función de visualización en views.py se vería así:

 from django.views.decorators.cache import cache_page ... @cache_page(60 * 10) def get_user_detail(request, user_id=None): ... return render(...) 

un poco tarde, pero puedes usar django-view-cache-utils para eso.