es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo enviar datos a un comando de gestión de Django en ejecución?

Tengo un comando de gestión personalizado de Django que se ejecuta constantemente a través del supervisor (mantener la conexión activa).

Necesito que en ciertas circunstancias (por ejemplo, una señal en el proyecto o un cambio en la base de datos) el proceso de gestión de Django reaccione a estos cambios.

Intenté buscar algo similar pero no parece encontrar una implementación simple.

ACT: En el comando de gestión inicio el proceso de transmisión de Twitter API para rastrear nuevos tweets para las etiquetas de la base de datos de Django. Al agregar una nueva etiqueta a la base de datos, quiero reiniciar la conexión de transmisión.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, se podría utilizar las señales de Django para enviar una señal cada vez que se agrega una nueva etiqueta a la base de datos. Luego, se puede definir un manejador de señales que reinicie el proceso de transmisión.

    Estos son los pasos generales para lograrlo:

    1. Definir una señal personalizada de Django que se enviará cada vez que se agregue una nueva etiqueta a la base de datos.
    from django.dispatch import Signal
    
    tag_added_signal = Signal()
    
    1. En el código que agrega una nueva etiqueta a la base de datos, emitir la señal. Por ejemplo, en una vista que maneje la creación de etiquetas:
    from .signals import tag_added_signal
    
    def create_tag(request):
        # ...código para manejar la creación de etiquetas...
        tag_added_signal.send(sender=None)
        # ...resto del código...
    
    1. Definir un manejador de señales que reinicie el proceso de transmisión. Esto se puede definir en el mismo archivo de comando de gestión que inicia el proceso de transmisión.
    from django.core.management.base import BaseCommand
    from django.db.models.signals import post_save
    from django.dispatch import receiver
    from .signals import tag_added_signal
    from .stream import start_stream
    
    class MyCommand(BaseCommand):
        help = 'Mi comando personalizado para transmitir tweets'
    
        def handle(self, *args, **options):
            # ...código para iniciar el proceso de transmisión...
    
    @receiver(tag_added_signal)
    def restart_stream(sender, **kwargs):
        start_stream()
    
    1. Registrar el manejador de señales llamando a post_save.connect en el método ready de cualquier archivo de configuración de la aplicación (por ejemplo, myapp/apps.py).
    from django.apps import AppConfig
    from django.db.models.signals import post_save
    from myapp.models import Tag
    from .signals import restart_stream
    
    class MyAppConfig(AppConfig):
        name = 'myapp'
    
        def ready(self):
            post_save.connect(restart_stream, sender=Tag)
    

    Con estos cambios, cada vez que se agregue una nueva etiqueta a la base de datos, se enviará la señal tag_added_signal, lo que a su vez activará el manejador de señales restart_stream para reiniciar el proceso de transmisión.

    Tenga en cuenta que si tiene varios procesos ejecutando el mismo comando de gestión (por ejemplo, a través de supervisor), es posible que necesite implementar un mecanismo de señalización distribuida (por ejemplo, utilizando una cola de mensajes como RabbitMQ o Redis) para asegurarse de que todos los procesos reciban la señal.

Comments are closed.