2009-10-27 14 views
9

Tengo Django ejecutándose en Apache a través de mod_wsgi. Creo que Django está almacenando en caché mis páginas del lado del servidor, lo que está causando que parte de la funcionalidad no funcione correctamente.Cómo deshabilitar el almacenamiento en caché de páginas de Django/mod_WSGI

Tengo un temporizador de cuenta atrás que funciona al obtener la hora actual del servidor, determinar el tiempo restante de la cuenta regresiva y sacar ese número a la plantilla HTML. Un temporizador de cuenta atrás de JavaScript toma el control y ejecuta la cuenta regresiva para el usuario.

El problema surge cuando el usuario actualiza la página o navega a una página diferente con el temporizador de cuenta atrás. El temporizador parece saltar a diferentes momentos esporádicamente, por lo general volviendo al mismo tiempo una y otra vez en cada actualización.

Usando HTTPFox, la página no se está cargando desde la memoria caché de mi navegador, por lo que parece que Django o Apache están almacenando en caché la página. ¿Hay alguna forma de desactivar esta funcionalidad? No voy a tener suficiente tráfico para preocuparme por el almacenamiento en caché del resultado del script. ¿O estoy completamente equivocado acerca de por qué está sucediendo esto?

[Editar] De los mensajes a continuación, parece que el almacenamiento en caché está deshabilitado en Django, lo que significa que debe estar sucediendo en otro lugar, tal vez en Apache?

[Editar] Tengo una descripción más detallada de lo que está sucediendo: para las primeras 7 (o más) solicitudes hechas al servidor, las páginas son renderizadas por el script y devueltas, aunque cada una de esas 7 páginas parece ser almacenado en caché como aparece más tarde. En la 8ª solicitud, el servidor sirve la primera página. En la novena solicitud, sirve la segunda página, y así sucesivamente en un ciclo. Esto dura hasta que reinicie apache, cuando el proceso comience de nuevo.

[Editar] He configurado mod_wsgi para ejecutar solo un proceso a la vez, lo que provoca que el temporizador se restablezca al mismo valor en todos los casos. Curiosamente, hay otro componente en mi página que muestra una imagen aleatoria en cada solicitud, utilizando el orden ('?'), Y que se actualiza con diferentes imágenes cada vez, lo que indicaría que el almacenamiento en caché está ocurriendo en Django y no en Apache.

[Editar] A la luz de la edición anterior, volví y revisé el archivo views.py relevante, descubriendo que la variable de inicio de cuenta atrás se estaba configurando globalmente en el módulo, fuera de las funciones de visualización. Mover esa configuración dentro de las funciones de vista resolvió el problema. Entonces resultó que no era un problema de almacenamiento en caché después de todo. Gracias a todos por su ayuda en esto.

+0

http://www.djangobook.com/en/2.0/chapter15/ – cwallenpoole

Respuesta

6

Desde mi experiencia con mod_wsgi en Apache, es muy poco probable que están causando el almacenamiento en caché. Un par de cosas para probar:

  1. Es posible que tenga algún proxy server entre el ordenador y el servidor web que está apropiada o no almacenamiento en caché de páginas. A veces los ISP ejecutan servidores proxy para reducir el ancho de banda fuera de su red. ¿Puede proporcionar los encabezados HTTP de una página que se almacena en caché (Firebug puede dárselos a usted). Los encabezados que me interesarían específicamente incluyen Cache-Control, Expires, Last-Modified y ETag.
  2. Puedes publicar tus MIDDLEWARE_CLASSES desde tu archivo settings.py. Es posible que tenga un Middleware que realiza el almacenamiento en caché para usted.
  3. Puede grep su código para los siguientes elementos "cargar caché", "django.core.cache" y "cache_page". A * grep -R "búsqueda" ** funcionará.
  4. ¿El settings.py (o cualquier cosa que importe como "from localsettings import *") incluye CACHE_BACKEND?
  5. ¿Qué ocurre cuando reinicias Apache? (Por ejemplo, sudo services apache restart). Si un reinicio despeja el problema, entonces se podría hacer apache almacenamiento en caché (es posible que esto también está claro a cabo una locmen Django caché backend)
+0

Estoy de acuerdo. Probablemente Apache o su ISP hagan el almacenamiento en caché. –

+0

1. El sitio se está ejecutando actualmente en un servidor en nuestra red local, por lo que no hay proxy. 2. MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ) 3. Ninguno de esos términos aparecen en cualquier parte del código. 4. No 5. Reiniciar Apache borra el problema y actualiza la caché en un nuevo valor – Travis

1

¿Ha configurado específicamente el almacenamiento en caché de Django? De los documentos parece que sabría claramente si Django estaba almacenando en caché, ya que requiere trabajo de antemano para que funcione. Específicamente, debe definir dónde se guardan los archivos en caché.

http://docs.djangoproject.com/en/dev/topics/cache/

+0

no hice nada de esto trabajo preliminar, así que supongo que el almacenamiento en caché de Django está desactivado ... ¿Alguna idea de qué otra cosa podría estar causando el problema con el tiempo de inicio del temporizador almacenado en caché? ¿Podría apache con mod_wsgi estar haciendo esto? – Travis

1

¿Está utilizando una configuración multiproceso para Apache/mod_wsgi? Si lo es, eso explicará por qué las diferentes respuestas pueden tener un valor diferente para el temporizador, de la misma manera que cuando se inicializa el temporizador será diferente para cada solicitud de manejo de proceso. Entonces, ¿por qué puede saltar alrededor?

tener una lectura de:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

Calcular en qué modo o configuración está ejecutando Apache/mod_wsgi y quizás Publica lo que es de configuración. Sin saber, hay demasiadas incógnitas.

+0

httpd -V muestra que se está utilizando Prefork MPM. threaded: no, bifurcado: yes (conteo de proceso variable) – Travis

+0

Luego, las solicitudes separadas pueden ser manejadas por diferentes procesos y, por lo tanto, esos procesos pueden tener distintas vistas de datos. Lea también "http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html" para conocer los peligros de utilizar prefork con mod_python y mod_wsgi. –

+0

Eso parece ser lo que está sucediendo. Cambié la configuración para ejecutarla en el modo Daemon, lo que limita el número de procesos a uno, lo que lo ha limitado a una sola versión en caché de la página. Entonces mi temporizador se restablece al mismo valor en cada solicitud. Desafortunadamente, todavía no es el comportamiento deseado. – Travis

2

me encontré con esto:

soporte para la recarga automática Para ayudar a las herramientas de implementación puede activar el soporte para carga automática. Siempre que algo cambie el archivo .wsgi, mod_wsgi volverá a cargar todos los procesos de daemon para nosotros.

Para ello, sólo tiene que añadir la siguiente directiva a la sección de Directorio:

WSGIScriptReloading On 
+1

Eso está activado de manera predeterminada, por lo que no debería tener que preocuparse por ello. La manera en que se maneja la recarga se describe en http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode –

+2

No lo sé, pero puedo decir que he estado usando wsgi en dos máquinas diferentes: una con un sitio web complejo basado en Django (OpenStack Dashboard/Horizon) y otra con mi poseer scripts más simples, y activar WSGIScriptReloading en cada uno de ellos lo hacía así cuando modifiqué scripts, las modificaciones entrarían en vigencia en la próxima página de recarga sin tener que reiniciar Apache. – Brad

+1

Bueno, puedo decir que escribí mod_wsgi y el código lo tiene activado por defecto. Como se explica en el documento que he vinculado, para el modo incrustado en el archivo de secuencia de comandos WSGI se vuelve a cargar y no todo el código de la aplicación. Debería verificar si está utilizando el modo incrustado o el modo daemon como se describe en el documento. Muy a menudo, las personas no tienen la directiva WSGIProcessGroup y no están usando el modo daemon como creen que son. –

Cuestiones relacionadas