我正在尝试在Docker中使用Flask和Celery,并且Flask应用程序上下文存在问题。
烧瓶== 1.0.2 芹菜== 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'
我也尝试了许多其他选择,包括Flask docs中提到的make_celery
,但是无法到达Flask和我的芹菜容器中的模型,因此不要认为这是非常特定的Flask-CeleryExt。
如果Celery任务不访问Flask对象,则可以使它们正常工作,但是我需要从Celery任务访问SQLAlchemy模型和自定义类。
如何使芹菜在芹菜容器中正常工作并能够访问Flask对象?