2009-10-19 26 views
11

Recientemente implementé el excelente marco de caché de Django. Sin embargo, por lo que entiendo, Django no guardará en caché una vista en la que se pasen los parámetros en una solicitud de obtención. Tengo una vista Ajax que se pasa los parámetros que me gustaría almacenar en caché durante X segundos, ¿cuál sería una manera fácil de hacer esto?Cache una vista django que tiene parámetros de URL

En pseudo código Actualmente tengo una URL:

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

me gustaría almacenar en caché cualquier esta url con tal de que tiene los mismos parámetros de conseguir.

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

myview(stuff) 

myview = cache_page(myview, 60 * 3) 

Yo ya había leído sobre django's vary headers pero fue un poco por encima de mi cabeza, y ni siquiera estoy seguro de su correcta la solución

+2

¿Hay alguna razón por la que no quiere solo use: 'http: // mysites/ajaxthing/user/foo/items/10 /' De esta forma puede dar un paso lateral en este problema. –

+0

Lea la respuesta de euqidron a continuación, este comportamiento ha cambiado en Django 1.3. –

Respuesta

16

derecho, varían las cabeceras no es la solución correcta, se utiliza cuando se desea almacenar en caché basado en las cabeceras de petición del cliente como agente de usuario, etc.

tendrá que utilizar low-level API o template fragment caching. Depende de tus puntos de vista realmente.

Con API de bajo nivel que 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 
    ... 
    .. 
    . 
+0

+1 para el almacenamiento en caché de fragmentos de plantilla. Es realmente útil en algunas situaciones. –

+0

Gracias por el resumen conciso, eso es realmente útil. –

8

Sí, puede utilizar Django-view-cache-utils, aquí está el código para su 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): 
    ... 
+2

este enfoque es bueno, pero abordamos dos problemas principales con el código: 1. podría haber conflicto para dos vistas con los mismos argumentos de URL, 2. la str (request.GET) puede regresar de manera diferente, porque la visualización de la entrada del diccionario no tiene especificada orden. Más tarde utilicé este código: @cache_page_with_prefix (60 * 15, lambda request: md5_constructor (request.build_absolute_uri()). Hexdigest()). –

+0

Gracias por su consejo, respuesta actualizada. –

1

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

Por ejemplo, si usted tiene una URL como:

http://example.com/user/some_user_id 

Su función de vista en views.py sería algo como esto:

from django.views.decorators.cache import cache_page 
... 

@cache_page(60 * 10) 
def get_user_detail(request, user_id=None): 
    ... 
    return render(...) 
+0

Intenté esto pero obtuve AttributeError de urls.py cuando uso vistas genéricas: url (r '^ (? P [0-9] +)/teams/(? P [0-9] +)/detail/$ ', vistas.TeamDetailView.as_view(), name = 'team_detail'), AttributeError: el objeto 'function' no tiene ningún atributo 'as_view' – simi

Cuestiones relacionadas