2009-10-22 13 views
5

Implementé recientemente el almacenamiento en caché en todo el sitio usando memcached en mi aplicación Django, establecí el TTL en unos 500 segundos e implementé caché por vista en otras partes de la aplicación web. El problema que tengo es que cuando un usuario cierra la sesión, porque es una publicación de formulario, el sitio se comporta como se esperaba, sin embargo, si se dirige a una parte del sitio protegida por contraseña, la aplicación se comporta como si todavía hubiera iniciado sesión. en, a menos que presionen "actualizar". Soy nuevo en el almacenamiento en caché y me pregunto si puedo hacer algo inteligente para evitar esto.Almacenamiento en caché en el sitio con Django: problemas con las páginas protegidas con contraseña al cerrar sesión

Respuesta

7

Me encontré con problemas similares. La forma estándar de Django es desactivar el caché para los usuarios autenticados.

#settings.py 
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True 

Funciona bien si diferentes usuarios ver diferentes páginas (ejemplo: su nombre de usuario en ellos) y no se puede tener una versión para ellos.

Pero si solo hay 2 versiones de página: para usuarios autenticados y para otros, no es bueno deshabilitar por completo la memoria caché para usuarios autenticados. Escribí un app que, además de todo, permite ajustar la memoria caché en este caso.

Actualización.

BTW: mencionó que al hacer clic en "actualizar" se recibe la versión correcta de la página. Significa que el problema es el caché del lado del cliente (cabecera Expires o E-tag), no el caché del servidor.

Para evitar el almacenamiento en caché del lado del cliente (tiene que hacer eso si tiene varias versiones de la página bajo la misma URL) use el decorador @cache_control(must_revalidate=True).

+0

Por curiosidad, ¿funciona tu aplicación si tengo 3 versiones en lugar de dos? (Anónimo, autenticado, personal)? – Powerlord

+0

Sí. Se puede usar para tener diferentes versiones de páginas basadas en cualquier cosa que se solicite. Esto significa que puede tener páginas o páginas en caché por usuario almacenadas en caché por atributo del usuario o páginas almacenadas en caché por las cookies. –

+0

.. o páginas almacenadas en caché por los parámetros GET –

1

En la vista de una parte del sitio protegida con contraseña, ¿comprueba si el usuario está registrado o es anónimo antes de buscar los datos (y tal vez traer datos del caché)?

Deberías. Django lo ayuda, con un decorador requerido para iniciar sesión que puede colocar en la vista. Eche un vistazo a esto: http://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

+0

Sí, hago eso, todo tiene un decorador requerido para iniciar sesión, el problema es que el estado de inicio de sesión está almacenado en la memoria caché. –

+0

Pero no queda claro si presiona "actualizar". –

Cuestiones relacionadas