2010-01-19 9 views
8

Necesito un lugar para ejecutar un código de inicialización que sea específico de la aplicación (como la conexión a señales). Cuando puse el código en el módulo __init__.py de una aplicación, terminé con una importación circular de los modelos.Código de inicialización de la aplicación Django (como la conexión a señales)

¿Hay alguna forma de activar una función cuando se configura el marco y antes de ejecutar cualquier solicitud?

Uso la versión bastante vieja de django 96.6, pero también estoy interesado en las soluciones para la versión actual.

En cuanto a la duplicación de otras preguntas: Aquí es cómo la cuestión se diferencian de los duplicados sugeridas por S. Lott en los comentarios:

Comentarios a las soluciones actuales: no puedo utilizar URLs ya que la mayoría de mis aplicaciones no tienen ninguna URL expuestos. Simplemente escuchan señales y almacenan información adicional en la base de datos.

+0

Duplicado: http: // stackoverflow.com/questions/1797046/correct-place-to-put-extra-startup-code-in-django, Duplicate: http://stackoverflow.com/questions/1986060/where-should-i-place-the-one- time-operation-operation-in-the-django-framework –

+0

@ S.Lott No es un duplicado. Necesito un código que se ejecute para cada instancia del intérprete de Python justo después de que se inicialice el framework django. Elaboraré en la pregunta –

Respuesta

5

Las señales, específicamente, se recomiendan poner en el models.py de su aplicación.

Pruebe models.py o urls.py y avísenos si tiene algo de suerte.

+0

No puedo ponerlo en los modelos ya que necesito la función en su propio módulo y necesito usar mis modelos en ese módulo. –

+0

La definición de la función de señales puede estar en un archivo separado (utilizo signals.py - creativo, lo sé) pero luego en mi models.py agrego en la parte inferior algo como post_save.connect (profile_updater, sender = MyProfile) por supuesto con las importaciones apropiadas. – ashchristopher

+1

@ashchristopher pero si su signal.py usa modelos, termina con referencias circulares. No quiero importar modelos en el controlador de señal muy. –

5

El mejor lugar para este tipo de cosas ... en cualquier lugar, solo impórtelo en su archivo urls.py (por obvias razones las URL se están cargando antes de cualquier solicitud).

+0

He esperado algo más explícito :( –

+0

Pocas de mis aplicaciones no tienen urls en absoluto. (Simplemente escuchan señales y almacenan información adicional en la base de datos) –

+0

las señales no se conectarían si ejecuta comandos de administración –

2

Si no proporciona direcciones URL, entonces realmente necesita ponerlo en models.py, así es como es.

Ahora, a sus problemas: Quiere definirlo en su propio módulo, genial, haga eso. Para evitar una importación circular, use django.db.models.get_model para devolver el modelo de forma dinámica. Puede proporcionar una función de inicialización para su módulo de señales para importar el modelo relevante y conectar las señales relevantes. Esta función se llamaría al final de models.py, ejecutándose solo una vez y luego de inicializar su modelo.

Todavía hay una posibilidad de que esto no funcione (si los modelos aún no están listos cuando lo configura), pero inténtelo y háganoslo saber.

0

Para mí, las siguientes obras:

En init .py:

from . import models 
from . import signals 

signals.py las importaciones procedentes de los modelos, pero no al revés. signals.py contiene un código de módulo que se ejecuta inmediatamente cuando se importa y se ejecuta cuando se inicia el servidor django.

Cuestiones relacionadas