Я пытаюсь использовать 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?