我试图在Docker中使用Flask和Celery,并且遇到了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
容器内部,我可以根据documentation找到 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
中所述的 make_celery
,但是无法在芹菜容器中找到Flask和我的模型,所以不要相信这对Flask-CeleryExt非常具体 .
如果他们不访问Flask对象,我可以使Celery任务正常工作,但我需要从我的Celery任务访问SQLAlchemy模型和自定义类 .
如何让Celery在我的芹菜容器中正常工作并能够访问Flask物品?