芹菜/烧瓶接收类型为(应用程序工厂+蓝图)的未注册任务



使用与蓝图和Flask Restful api结合设置的Flask应用程序工厂会导致Celery 3.1.24(im on windows(出现问题。

@celery.task装饰器放置在Flask Restful的资源类中,会导致Celery在尝试运行celeri+redis时检测不到任何任务,以便它可以接受作业。

api_resource.py 示例

class Api(Resource)
def patch(self, received_key):
```do work here```

#start celery and task
""" @celery.task(name='api.internal.upvote_task')
def the_task(username, package, key_type, url):
ExampleClass.launch_tasks(buyer_username= username, package = package, key_type= key_type, url = url) """
the_task.apply_async(args=[username, package, key_type, url], countdown=10)
return used_key, 202

我甚至尝试添加一个工作人员名称@celery.task(name='api.internal.the_task')

我试着用运行它

celery -A app worker -l info

celery worker -A app.celery --loglevel=info

celery -A app.api.internal worker --loglevel=DEBUG  

这就是我试图使用到任务模块的直接路径,并试图让芹菜自己检测它们。

在我重构应用程序并切换到应用程序工厂格式之前,我无法让芹菜检测到我的任务何时工作。

我最终找到如何解决这个问题的方法并不是尝试15种不同的方法来强制芹菜通过绝对路径检测任务,将其放在python路径或其他任何路径中。

事实上,我有点沮丧,因为经过几个小时的测试,我终于把@celery.task函数移到了Resource类之外,并从类内调用了它(在我的例子中是api端点(。

芹菜捡了起来,我尝试了两种不同的方法,在我做出改变后,效果很好。第一个是设置一个run.py/manage.py/selery_runnger.py,就像教程中显示的那样。我早些时候试过了,但在班里不起作用。

我唯一的问题是,我不想从那里推送应用程序上下文,也不想在那个文件中导入芹菜。

第二种方法是简单地在芹菜配置中使用includecelery = Celery(__name__, broker=Config.CELERY_BROKER_URL, include=['app.api.internal'])

这以前也不起作用。对一些人来说,这似乎是显而易见的,但将芹菜与所有这些不同的包装一起使用可能会很棘手,我希望这能帮助到一些人。

我仍然需要解决Flask SQLA在从芹菜运行任务时不确定Flask应用程序上下文的问题,但这是一个不同的问题。

最新更新