Acabo de comenzar a implementar oyentes de señal en un proyecto de django. Si bien entiendo qué son y cómo usarlos. Me está costando mucho averiguar dónde debo ponerlos. La documentación del sitio django tiene esto que decir:
¿Dónde debería vivir este código?
Puede poner el código de registro y manejo de señal en cualquier lugar que desee. Sin embargo, deberá asegurarse de que el módulo en el que se encuentra se importe desde el principio para que el manejo de la señal se registre antes de que se deba enviar cualquier señal. Esto hace que la aplicación models.py sea un buen lugar para colocar el registro de los manejadores de señal.
Si bien es una buena sugerencia, tener clases o métodos que no sean modelos en mis models.py simplemente me molesta.
Entonces, ¿cuál es la mejor práctica / regla para almacenar y registrar manejadores de señales?
fuente
Foo
que forma partefooapp
. Pero el receptor de señal es una extensión y vive en una aplicación diferente (por ejemplootherapp
).Esto se agregó a la documentación cuando se lanzó Django 1.7 :
La mejor práctica es definir sus controladores en handlers.py en un submódulo de señales, por ejemplo, un archivo que se vea así:
yourapp / señales / handlers.py :
El mejor lugar para registrar su manejador de señal es en el AppConfig de la aplicación que lo define, utilizando el método ready () . Esto se verá así:
yourapp / apps.py :
Asegúrese de que está cargando su AppConfig especificándolo directamente en INSTALLED_APPS de settings.py, o en el
__init__
de su aplicación. Consulte la documentación de ready () para obtener más información.Nota: Si también proporciona señales para que otras aplicaciones también escuchen, colóquelas en el
__init__
módulo de señales, por ejemplo, un archivo que se vea así:yourapp / señales / __ init__.py
Luego, otra aplicación puede escuchar su señal importándola y registrándola, por ejemplo
from yourapp.signals import task_generate_pre_save
. Separar sus señales de sus manejadores mantiene las cosas limpias.Instrucciones para Django 1.6:
Si todavía está atascado en Django 1.6 o inferior, entonces haría lo mismo (defina sus controladores en yourapp / signal / handlers.py) pero en lugar de usar AppConfig, cargaría los controladores a través de __init__.py de su aplicación, por ejemplo, algo como:
yourapp / __ init__.py
Esto no es tan bueno como usar el método ready () porque a menudo causa problemas de importación circular.
fuente
__init__
señales de importación no funcionen para mí, por lo que me pregunto si hay otro lugar desde el que pueda importar señales hasta que estemos listos para actualizar a una versión posterior de Django.from . import handlers
(o similar) enyourapp/signals/__init__.py
?yourproject.
en la última línea del bloque de código de clase TaskConfig. Tengo esto trabajando exactamente con esta estructura, así que considere esto qa :)Acabo de encontrar esto, y como mis señales no están relacionadas con el modelo, pensé en agregar mi solución.
Estoy registrando varios datos alrededor de iniciar / cerrar sesión, y necesitaba conectarme
django.contrib.auth.signals
.Puse los manejadores de señales en un
signals.py
archivo y luego importé las señales del__init__.py
archivo del módulo, ya que creo que esto se llama tan pronto como se inicia la aplicación (las pruebas con unaprint
declaración sugieren que se llama incluso antes de que se lea el archivo de configuración).y en señales.py
Soy bastante nuevo en Django (/ python), ¡así que estoy abierto a cualquiera que me diga que es una idea terrible!
fuente
user_logged_in.connect(on_logged_in)
Lo más probable es que pase eldispatch_uid
argumento. Más en docs.djangoproject.com/en/dev/topics/signals/… .Hace poco leí este artículo sobre las mejores prácticas cuando se trata de diseñar sus proyectos / aplicaciones, y sugiere que todas sus señales de despachador personalizadas deben ir en un archivo llamado
signals.py
. Sin embargo, eso no resuelve completamente su problema, ya que aún necesita importarlos en algún lugar, y cuanto antes se importen, mejor.La sugerencia del modelo es buena. Como ya ha definido todo en su
signals.py
archivo, no debería tomar más de una línea en la parte superior del archivo. Esto es similar a la forma enadmin.py
que se presenta el archivo (con las definiciones de clase en la parte superior y el código para registrar todas las clases de administración personalizadas en la parte inferior), si define sus señales, conéctelas en el mismo archivo.¡Espero que ayude! En definitiva, se reduce a lo que prefieres.
fuente
signals.py
archivo, pero no sabía cómo debería llamarse después. Al importarlo en mimodels.py
archivo, obtuve una solución muy limpia, sin "contaminar" mi archivo models.py. ¡Gracias! :)Los modelos.py y signal.py en cada aplicación han sido los lugares recomendados para conectar señales, sin embargo, no son la mejor solución, en mi opinión, para mantener las señales y los controladores enviados. El despacho debe ser la razón por la cual las señales y los manejadores inventados en django.
Estuve luchando por mucho tiempo, y finalmente descubrimos la solución.
crear un módulo conector en la carpeta de la aplicación
entonces tenemos:
en app / Connectors.py, definimos manejadores de señal y los conectamos. Se proporciona un ejemplo:
luego, en models.py, agregamos la siguiente línea al final del archivo:
Todo hecho aquí.
De esta manera, podemos poner señales en signal.py, y todos los controladores en connector.py. Sin desorden en modelos y señales.
Espero que brinde otra solución.
fuente
Los guardo en un archivo separado
signals.py
, enmodels.py
después de que todos los modelos estén definidos. Los importo y conecto modelos a señales.señales.py
modelos.py
Esto me proporciona una separación lógica, por supuesto, no hay nada de malo en mantenerlos en models.py , pero es más manejable de esta manera.
¡¡Espero que esto ayude!!
fuente
Pequeño recordatorio sobre
AppConfig
. No olvides configurar:fuente