python - 跨不同容器接收 Django 信号

标签 python django docker-compose django-signals

我目前正在做一个 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 方法,并设置您的后端以向您的应用程序发送一个请求(在其他容器)来接收你想要的数据......你可以使用 requestscurl

我考虑到您在不同的容器中使用 2 个服务器

关于python - 跨不同容器接收 Django 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618568/

相关文章:

django - 如何过滤多对多模型?

python - 优化 Django/Python 中的 PDF 转换

django - AllAuth 支持 python 3.4 和 django 1.8.2?

docker - 具有撰写文件的docker swarm无法识别 “links”

python - pyparsing:提取包含特定文本的字符串

python - SalesforceObject.search/get 不能一起工作? Python/简单-salesforce

docker - 为什么在docker-compose中忽略COMPOSE_PROJECT_NAME和-p?

amazon-web-services - 带有 Docker 容器的 AWS Cloudwatch 日志 - NoCredentialProviders : no valid providers in chain

python - 启动和停止服务器脚本

python - 使用 C++ 扩展 Python 时,将模块方法放入不同的源文件失败