2010-09-27 65 views
8

Estoy tratando de almacenar en caché los resultados de la consulta en mi aplicación django. Sin embargo, parece que está almacenando en caché toda la aplicación. Probé siguiente logi:Cómo guardar el resultado de la consulta en django?

def cacheView(): 
    result = cache.get('key') 
    if result is None: 
    result = Model.objects.get(id=1) 
    cache.set('key', 'result') 

Estoy llamando a este método cuando usuario se conecta Sin embargo, si trato de cerrar la sesión después de iniciar sesión, me mantiene en la misma página como si todavía estoy conectado yo tratamos de seguir.. la documentación de Django en el caché al http://docs.djangoproject.com/en/1.2/topics/cache/ pero no tuvo éxito.

Otra cosa que probé es que si trato de usar el decorador caché justo por encima de la vista como:

@cache_control(max_age=1000) 
def cacheView(): 
... 

lo hace da un error que dice "cabecera de la respuesta no está definido". Soy nuevo en Django y estoy seguro de que me perdí algo. ¿Alguna idea?

Respuesta

8

RTFM :) Oficial Django Docs: Caching and QuerySets

Cada QuerySet contiene una memoria caché, para minimizar el acceso de base de datos. (...)

y:

En un QuerySet de nueva creación, la caché está vacía. La primera vez que se evalúa un QuerySet y, por lo tanto, ocurre una consulta en la base de datos, Django guarda los resultados de la consulta en el caché de QuerySet y devuelve los resultados que se solicitaron explícitamente (por ejemplo, el siguiente elemento, si QuerySet se itera encima). Evaluaciones subsiguientes de QuerySet reutilizan los resultados en caché.

El almacenamiento en caché se realiza automágicamente en caso de QuerySets (resultados de Consultas).

EDITAR: En cuanto a su código pegado en la pregunta. Si la clave aún no existe en la memoria caché, debe crearla con el método add(), pero recuerde que caducará de manera predeterminada después de 30 segundos. Si desea que se mantenga más tiempo, debe agregar la opción de tiempo de espera al método add()/set().

Si desea almacenar en caché todo su sitio (es decir, decoradores como los utilizó), necesita agregar middleware adecuado a su MIDDLEWARE_CLASSES en settings.py (en este orden exacto, porque el orden del middleware importa, es cargado de uno en uno a medida que los defina):

MIDDLEWARE_CLASSES = (
    # ... 
    'django.middleware.cache.UpdateCacheMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.cache.FetchFromCacheMiddleware', 
    # ... 
) 

Si no los tiene, entonces usted estará recibiendo malos errores de cabecera cada vez que vamos a usar las capacidades de almacenamiento en caché por el lugar.

+0

definitivamente perdida que en el manual. Ahora que sé que almacena en caché el queryset, mi siguiente pregunta sería qué método de caché usará. ¿Porque quería guardar esto en Memcache que configuré en mi settings.py pero no estoy seguro si django tomará ese método o utilizará el caché de la base de datos? – jindals

+0

De forma predeterminada, django está utilizando la memoria local para almacenar el caché. Si has configurado otro backend de caché, django lo usará. – bx2

+0

Una pregunta más ¿U necesita almacenar esta información por un tiempo muy largo? – bx2

1

En su ejemplo no está claro por qué el cierre de sesión fallaría, pero no debería tener nada que ver con el almacenamiento en caché de un modelo (a menos que esté almacenando el modelo de usuario en caché y autenticando en vez de request.user ?)

Está bien usar cache.get y cache.set tal como está (set creará una nueva clave si no existe).

Las consultas de almacenamiento en antememoria pueden ser difíciles ya que debe tener cuidado de invalidar la caché cuando los datos cambian para no dar resultados obsoletos.

Tenga una mirada en estas bibliotecas de consulta de almacenamiento en caché de Django que tienen como objetivo facilitar las cosas:

http://jbalogh.me/2010/02/09/cache-machine/

http://packages.python.org/johnny-cache/queryset_cache.html

+1

no necesita libs adicionales siempre que sepa qué está haciendo y qué quiere lograr, no hay nada más fácil (y más complicado) al mismo tiempo) que el almacenamiento en caché. – bx2

Cuestiones relacionadas