Pregunta

Estoy desarrollando un sitio Django. Estoy haciendo todos mis cambios en el servidor en vivo, solo porque es más fácil de esa manera. El problema es que, de vez en cuando, parece querer almacenar en caché uno de los archivos * .py en los que estoy trabajando. A veces, si presiono actualizar mucho, cambiará entre una versión anterior de la página y una versión más nueva.

Mi configuración es más o menos como se describe en los tutoriales de Django: http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

Estoy adivinando está haciendo esto porque está activando varias instancias del controlador WSGI, y dependiendo del controlador al que se envíe la solicitud http, puedo recibir diferentes versiones de la página . Reiniciar Apache parece solucionar el problema, pero es molesto.

Realmente no sé mucho sobre WSGI o '' MiddleWare '' o cualquiera de esa solicitud manejando cosas. Vengo de un fondo PHP, donde todo funciona :)

De todos modos, ¿cuál es una buena manera de resolver este problema? Will ejecutar el controlador WSGI es " modo demonio " aliviar el problema? Si es así, ¿cómo hago para que se ejecute en modo demonio?

¿Fue útil?

Solución

Puede resolver este problema no editando su código en el servidor en vivo. En serio, no hay excusa para ello. Desarrolle localmente utilizando el control de versiones y, si es necesario, ejecute su servidor desde una comprobación en vivo, con un enlace posterior a la confirmación que verifica su última versión y reinicia Apache.

Otros consejos

Ejecutar el proceso en modo demonio no ayudará. Esto es lo que está sucediendo:

mod_wsgi está generando múltiples procesos idénticos para manejar las solicitudes entrantes para su sitio Django. Cada uno de estos procesos es su propio intérprete de Python y puede manejar una solicitud web entrante. Estos procesos son persistentes (no se activan ni eliminan para cada solicitud), por lo que un solo proceso puede manejar miles de solicitudes, una tras otra. mod_wsgi puede manejar múltiples solicitudes web simultáneamente ya que hay múltiples procesos.

El intérprete de Python de cada proceso cargará sus módulos (sus archivos personalizados de Python) siempre que un " módulo de importación " es ejecutado. En el contexto de django, esto sucederá cuando se necesite un nuevo view.py debido a una solicitud web. Una vez que se carga el módulo, reside en la memoria, por lo que los cambios que realice en el archivo no se reflejarán en ese proceso. A medida que ingresen más solicitudes web, el intérprete de Python del proceso simplemente usará la versión del módulo que ya está cargada en la memoria. Está observando incoherencias entre las actualizaciones, ya que cada solicitud web que realiza puede ser manejada por diferentes procesos. Algunos procesos pueden haber cargado sus módulos Python durante las revisiones anteriores de su código, mientras que otros pueden haberlos cargado más tarde (ya que esos procesos no habían recibido una solicitud web).

La solución simple: cada vez que modifique su código, reinicie el proceso de Apache. La mayoría de las veces eso es tan simple como ejecutarse como root desde el shell "/etc/init.d/apache2 restart". Creo que una recarga simple también funciona, que es más rápida, "/etc/init.d/apache2 reload" "

La solución daemon: si está utilizando mod_wsgi en modo daemon, entonces todo lo que necesita hacer es tocar (comando unix) o modificar su archivo de script wsgi. Para aclarar la publicación de scrompt.com, las modificaciones a su código fuente de Python no resultarán en que mod_wsgi vuelva a cargar su código. La recarga solo ocurre cuando el archivo de script wsgi ha sido modificado.

Último punto a tener en cuenta: solo hablé sobre wsgi como el uso de procesos por simplicidad. wsgi realmente usa grupos de subprocesos dentro de cada proceso. No sentí que este detalle fuera relevante para esta respuesta, pero puede obtener más información al leer mod_wsgi .

Debido a que está utilizando mod_wsgi en modo incrustado, sus cambios no se verán automáticamente. Los estás viendo de vez en cuando porque Apache inicia nuevas instancias de controlador a veces, que detectan las actualizaciones.

Puede resolver esto utilizando el modo demonio, como se describe aquí . Específicamente, querrás agregar las siguientes directivas a tu configuración de Apache:

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com

Lea la documentación de mod_wsgi en lugar de confiar en la información mínima para el alojamiento de mod_wsgi contenida en el sitio de Django. En particular, lea:

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

Esto le dice exactamente cómo funciona la recarga del código fuente en mod_wsgi, incluido un monitor que puede usar para implementar el mismo tipo de recarga del código fuente que el servidor de ejecución Django. También vea qué habla sobre cómo aplicar eso a Django.

http: //blog.dscpl .com.au / 2008/12 / using-modwsgi-when-development-django.html    http: //blog.dscpl. com.au/2009/02/source-code-reloading-with-modwsgi-on.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top