我目前正在做一个 Django 项目,我在处理跨不同容器的信号时遇到了一些问题。
我有一个连接到上游数据管道并填充 Django 数据库的第一个容器。我有一个后端本身的另一个容器,我在其上运行服务器。我想使用信号“post save”向我的应用程序之一发出信号,表明已保存新模型实例。因此,我在我的应用程序中使用下一段代码来接收此信号并处理已保存的实例。
@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 信号,或者我应该使用其他方法来发送和接收这些消息?
谢谢
最佳答案
等等?信号仅在 django 项目内部起作用,一个信号可以到达的最外部点是当它们在方法内部运行命令 save() 并检查数据库是否保存它时...
你可以做的是在你的终端、API、套接字或任何你想在后端进行对话的通信中运行一些 python 代码。
所以试一试,您可以为您的管道上游创建一个 API(我不太了解它是什么),以便能够接收一些 POST 或 GET 方法,并设置您的后端以向您的应用程序发送一个请求(在其他容器)来接收你想要的数据......你可以使用 requests
或 curl
我考虑到您在不同的容器中使用 2 个服务器
关于python - 跨不同容器接收 Django 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618568/