跨不同容器接收Django信号

时间:2018-07-31 17:00:12

标签: python django docker-compose django-signals

我目前正在处理Django项目,在处理不同容器中的信号时遇到一些问题。

我有一个第一个容器,该容器连接到上游的数据管道并填充Django的数据库。我还有另一个容器供后端本身使用,并在该容器上运行服务器。我想使用信号“后保存”向我的应用程序发出一个信号,告知已保存了新的模型实例。因此,我使用应用程序中的下一段代码来接收该信号并处理已保存的实例。

@receiver(post_save, sender=Organization)
def index_post_save(sender, instance, **kwargs):
    connections.create_connection(hosts=['elasticsearch'])  
    instance.indexing()

如果我在Django管理界面上手动创建一个Organization实例,则此方法非常有效,但是当我使用第一个容器填充数据库时未收到信号。

这是我的docker-compose文件的一部分,其中包含我描述的两个容器:

worker:
   build:
      context: .
      dockerfile: Dockerfile
   command: ./run_celery.sh
   env_file:
      - ./.envs/.local/.workers
   volumes:
      - .:/app

web:
   restart: always
   build:
     context: .
     dockerfile: Dockerfile
   hostname: web
   command: /app/run_web.sh
   env_file:
     - ./.envs/.local/.web
   volumes:
     - .:/app
   ports:
     - "80:8000"
   links:
     - db
     - pipeline_db
   depends_on:
     - db
     - pipeline_db
     - elasticsearch

是否可以使用跨容器的Django信号,还是应该使用其他方法发送和接收这些消息?

谢谢

1 个答案:

答案 0 :(得分:0)

等等什么?信号仅在django项目中有效,一个信号可以到达的最外部点是当它们在方法内部运行命令save()并检查数据库是否保存了该信号时。

您可以做的是在终端,API,套接字或要与后端通信的任何通讯中运行一些python代码。

这样一来,您可以向上游的管道制作一个API(我不太了解它是什么),以便能够接收一些POST或GET方法,并设置后端将一个请求发送到您的应用程序(其他方法)容器)以接收所需的数据...您可以使用requestscurl

我认为您正在不同容器中使用2台服务器