Django在不同的docker容器之间进行通道

Pab*_*les 6 django celery docker django-channels

我正在使用django channels,我有一个关于如何处理使用发送消息的问题channels

上下文

我有2个容器:celery-worker而且api,我想通过websockets从celery-worker容器发送数据到浏览器通过api容器使用channels,这里是一张图片:

在此输入图像描述

你知道如何在api容器中"初始化"通道并在容器内使用这个通道celery-worker吗?celery-worker仅在容器调用之后,Group('pablo').send(message)它自动发送到浏览器.

任何建议都可以.

注意:我试图不发布代码,因为它非常广泛而且可能会导致很难理解这个问题但是如果你愿意我可以发布你需要的代码.

Edd*_*Paz 0

您需要让其他容器知道您依赖它们。例子。在这里您可以看到 PostgreSQL 具有 user_service 和 notification_service 的依赖项,您需要为每个想要使用链接或依赖的其他容器的容器添加此依赖项。这是一个例子。

version: '3'
services:
db:
    image: postgres
    ports:
    - '5434:5434'
user_service:
    build: ""
    environment:
    - JWT_SECRET=mysecret_json_web_token_pass
    command: python user/app.py
    volumes:
    - .:/microservices
    ports:
    - "9001:9001"
    depends_on:
    - db
notification_service:
    build: ""
    environment:
    - JWT_SECRET=mysecret_json_web_token_pass
    command: python notification/app.py
    volumes:
    - .:/microservices
    ports:
    - "9002:9002"
    depends_on:
    - db
Run Code Online (Sandbox Code Playgroud)

对于您的情况,您可能需要添加 dependent_on: - celery - redis

你也可以建立一个本地网络..但是我没有这样做,而是在同一个 docker-compose 中创建了容器,这样它们就可以互相了解。

这是另一个例子

version: '2'  
services:  
nginx:
    image: nginx:latest
    container_name: nx01
    ports:
    - "8001:8001"
    volumes:
    - ../src:/src
    - ./static:/static
    - ./media:/media/
    - ./config/nginx:/etc/nginx/conf.d
    depends_on:
    - web
web:
    build: .
    container_name: dg01
    command: gunicorn mydjango.wsgi 0.0.0.0:8000

    depends_on:
    - db
    links:
    - redis
    volumes:
    - ../src:/src
    - ./static:/static
    - ./media:/media/
    expose:
    - "8001"
db:
    image: postgres:latest
    container_name: pq01
    ports:
    - "5432:5432"

redis:
    image: redis:latest
    container_name: rd01
    ports:
    - '6379:6379'

celery:
    build: .
    container_name: cl01
    command: celery worker --app=app.tasks
    volumes:
    - ..:/src
    links:
    - db
    - redis
Run Code Online (Sandbox Code Playgroud)

在您的代码中调用它...像这样使用它。

CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
Run Code Online (Sandbox Code Playgroud)