2012-07-23 9 views
7

Los documentos django establece claramente¿Por qué no se debe modificar la configuración de django en el tiempo de ejecución?

No debe modificar la configuración de las aplicaciones en tiempo de ejecución.

Aquí está la link to that statement

Mi pregunta es, ¿por qué es esto así? Quiero agregar aplicaciones dinámicamente en el tiempo de ejecución y agregar bases de datos en tiempo de ejecución, las cuales implican editar las configuraciones. ¿Puede alguien explicar por qué las configuraciones no se deben editar en tiempo de ejecución y si existen excepciones, qué configuración son y por qué son excepcionales? No estoy muy interesado en cómo lograr mi objetivo, sino en la razón por la que los ajustes no deben modificarse.

+0

He echado un vistazo a https://docs.djangoproject.com/en/dev/ref/settings/, y me parece que estas son todas las configuraciones que se aplican al * inicio de la aplicación. * En consecuencia, no lo haría tiene mucho sentido modificarlos en tiempo de ejecución. –

Respuesta

5

La mayoría de los ajustes no se volverán a leer si los cambia en el tiempo de ejecución. Entonces Django no reconocerá los cambios que hagas.

Esto se debe a que Django es solo el código Python normal. No es como un servidor que está monitoreando su código, es solo parte de su código.

En algunos casos, algunas partes del código de Django podrían responder a cambios en la configuración, ya que podrían hacer 'configuraciones.DEFAULT_FROM_EMAIL' cada vez que se envía un correo, por ejemplo.

Pero si Django procesa la configuración de alguna manera, como tiene que hacer para INSTALLED_APPS, no se dará cuenta de que ha cambiado algo y volverá a realizar el procesamiento.

¿Qué configuraciones son seguras? Bueno, los documentos dicen "ninguno es seguro", porque podría cambiar en el futuro. Django podría guardar una copia de cualquier ajuste por algún motivo, o hacer algún procesamiento.

El cambio de INSTALLED_APPS nunca se pudo hacer funcionar, porque altera qué módulos se importan. Simplemente no hay forma de que Django pueda trabajar en la forma en que Python trabaja en este nivel, necesitaría poder 'desimportar' módulos, lo cual es básicamente imposible (la única forma es reiniciar el proceso), y hay otros problemas asociados con enlaces de aplicación cruzada.

1

AFAIK no hay documentación sobre la configuración que se puede modificar de forma segura durante el tiempo de ejecución, pero existe una open ticket que solicita que se documenten con mayor claridad.

+0

¿Qué hay de la propia variable de configuración? p.ej. cree un diccionario vacío en la configuración y añádalo durante el período en que el sistema se esté ejecutando (en este caso es irrelevante si los datos se pierden al reiniciar el sistema). – Derek

1

Si toma un look under the hood en el objeto de configuración que Django expone a la interfaz con el módulo de configuración de su proyecto, notará que no hay nada que le impida cambiar dinámicamente las configuraciones en tiempo de ejecución. No obstante, debe tener en cuenta que la arquitectura del marco se basa en un flujo de solicitud-respuesta donde se comparte mucho estado global entre subprocesos para la optimización de memoria, basándose en la premisa de que la aplicación se configura solo una vez durante la inicialización .

Cuestiones relacionadas