我有一个使用依赖注入和芹菜的Flask应用程序。我有下面的例子工作,但我的主要应用程序必须实例化芹菜所需的所有模块,除了创建第二个Flask实例。有更好的方法来实现这一点吗?
特别是:
为什么主"前端"应用要依赖整个"后端"堆栈来配置芹菜客户端?我想解耦这些子系统,因为前端只是启动任务。
main.py
import tasks.py
app = Flask(__name__)
FlaskInjector(app=app, modules=[A, B, C, D, E, F])
celery.py
app = Flask(__name__)
injector = Injector(modules=[A, B])
FlaskInjector(app=app, injector=injector)
celery = Celery(app.import_name, include=['tasks'])
tasks.py
from celery import celery, injector
@celery.task
def my_task():
injector.get(A).foo()
我没有从main
中导入app
,因为我不想让芹菜依赖于主应用程序中与运行任务无关的所有东西。相反,我不希望我的主应用程序依赖于配置工作器所需的芹菜客户端的所有引导。这对于小应用程序来说是很好的,但是随着大型系统的增长,管理这些依赖关系是很重要的,我不理解将芹菜客户端配置(用于调用任务)与工作器所需的内容分开。
我有一个前端Flask应用和后端芹菜应用。芹菜应用程序有我不想让Flask依赖的业务逻辑。它很大,很复杂,而且经常变化。我不想让Flask应用膨胀,每次芹菜变化时都重新部署它,或者让我的Flask开发人员暴露在芹菜代码中。但据我所知,任务的Flask调用不能与它们的芹菜实现解耦。
以下是答案(由@kindule提供):
应用程序。send_task (my_task,…)
http://docs.celeryproject.org/en/latest/reference/celery.html?highlight=send_task celery.Celery.send_task
https://github.com/celery/celery/issues/3474 issuecomment - 249723398