Сигналы Django не работают с каналами в настройке мультиконтейнера

У меня есть приложение django и реализация поддержки websocket с каналами и каналами API. Я использую демультиплексор с привязками к моим моделям. Например, когда я сохраняю модель, она отправляет изменения в мое открытое соединение через веб-сокет. Все работает хорошо, если я бегу ./manage.py runserver 0:80 и все в одном контейнере. Но если я разделю свое приложение с UWSGI, Дафни и рабочими контейнерами, используя докер, сигналы не сработают. Например, я хочу, чтобы любой работник из сельдерея (задача) активировал сигнал и отправил обновление через веб-сокет. В моей настройке мультиконтейнера соединение веб-сокета установлено в порядке, и сеть работает в порядке, но ничего не вызывает этот сигнал.

Как определяются сигналы, вы можете увидеть здесь, на github.

Я использую Django 1.9.12, Python 2.7, Docker и сборку на Debian Stretch.

докер-compose.yml

  web:
    build: .
    ports: ["8001:80"]

  daphne:
    build: .
    command: daphne -b 0.0.0.0 -p 8000 --access-log - -v 2 my_proj.asgi:channel_layer 

  ws_worker:
    build: .
    command: ./manage.py runworker -v 2

  celery_worker:
    build: .
    command: /usr/local/bin/celery -A my_proj worker

nginx.conf

upstream django {
    server unix:/home/docker/app.sock; 
}

server {
    listen 80;
    server_name 127.0.0.1;
    charset utf-8;
    client_max_body_size 1000M;

    location /static/ {
        alias /home/docker/static/;
    }

    # proxy to other container
    location /ws/ {
        proxy_pass http://daphne:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location / {
        uwsgi_pass  django;
        include     /home/docker/uwsgi_params;
    }

}

1 ответ

Моя проблема заключалась в том, что сигналы не загружались, потому что я определил классы привязки где-то еще, чем в models.py. Если я загружаю их после загрузки моделей в my_app/config.py, он работает в нескольких контейнерах

from django.apps import AppConfig as DefaultAppConfig

class AppConfig(DefaultAppConfig):
    def ready(self):
        # for websockets bindigns
        from my_app.websockets.bindings_one import *
        from my_app.websockets.bindings_two import *
Другие вопросы по тегам