Ошибка контекста приложения в приложении Flask с Celery в Docker - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать Flask и Celery в Docker, и у меня возникают проблемы с контекстом приложения Flask.

Flask == 1.0.2 celery == 4.2.0 Flask-CeleryExt == 0.3.1

Вот соответствующий код.

docker-compose.yaml

version: '3'

services:
  myapp:
    build:
      context: .
      dockerfile: compose/dev/myapp/Dockerfile
    ports:
      - '5000:5000'
      - '8888:8888'
    env_file: .env
    environment:
      - FLASK_ENV=development
    volumes:
      - .:/myapp
    entrypoint: /wait-for-postgres.sh
    command: flask run --host=0.0.0.0
    depends_on:
      - postgres
      - redis
    networks:
      - flask-redis-celery

  celery:
    build:
      context: .
      dockerfile: compose/dev/celery/Dockerfile
    command: 'celery -A myapp.tasks worker -Q default --loglevel=info'
    env_file: .env
    volumes:
      - .:/myapp
    depends_on:
      - redis
      - myapp
    networks:
      - flask-redis-celery

extensions.py

from flask_celeryext import FlaskCeleryExt
ext = FlaskCeleryExt()

app.py в функции register_extensions.Я использую шаблон приложения в своем приложении.

ext.init_app(app)

Внутри контейнера myapp я могу добраться до ext.celery по документации и увидеть, что у меня естьэкземпляр Celery и правильно отправить задачу

<Celery default at 0x7f600d0e7f98>

Однако попытка сделать то же самое в контейнере сельдерея в моем файле tasks приводит к тому, что ext.celery равно None.

tasks.py

from coupon.extensions import ext
celery = ext.celery # This is None

@celery.task(name='tasks.my_task', max_retries=2, default_retry_delay=60)
def my_task(some_args):
    # etc.

Ошибка

AttributeError: 'NoneType' object has no attribute 'task'

Я также пробовал множество других опций, включая make_celery, как отмечено в Документах Flask , но не могу добраться до Flask и моих моделей в контейнере сельдерея, поэтому не верьте, что это очень специфично для Flask-CeleryExt.

Я могу заставить задачи Celery работать нормально, если они не имеют доступа к объектам Flask,но мне нужно получить доступ к моделям и пользовательским классам SQLAlchemy из моих задач Celery.

Как я могу заставить Celery работать должным образом в моем контейнере сельдерея и иметь доступ к объектам Flask?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...