我正在尝试使用Celery Redis Flask运行一些后台工作 .
我的app结构是:
myapp/
celery_worker.py
manage.py
myapp/
__init__.py
app.py
bot/
__init__.py
tasks.py
accounts/
views.py
我将芹菜初始化为app.py:
celery = Celery('tasks', include=['bot.tasks'])
def create_app(config=None, app_name=None, blueprints=None):
# more Celery and other config here like celery.conf.update()
celery_worker.py
开始工作
from myapp import create_app, celery
app = create_app()
app.app_context().push()
tasks.py
包含
from myapp import celery
@celery.task(name='my_task_bot')
def my_task_bot():
# pass
现在,当我尝试使用以下导入从tasks.py访问accounts / views.py中的任务时:
from ..bot.tasks import my_task_bot
我收到 ImportError: cannot import name celery
错误 .
无论我在哪里尝试导入任务,我都会收到此错误 . 这个 celery
实例似乎是在app.py中初始化的实例,但是没有导入 .
PS:我正在关注https://github.com/ezequielo/flask_celery_exp repo的模式,它运行正常 . 但不是我的应用程序 .
Edit:
这是Traceback:
Traceback (most recent call last):
File "manage.py", line 8, in <module>
from myapp import create_app
File "/home/mars/myapp/myapp/__init__.py", line 3, in <module>
from app import create_app, celery
File "/home/mars/myapp/myapp/app.py", line 18, in <module>
from .accounts import (accounts, AccountsAdmin)
File "/home/mars/myapp/myapp/accounts/__init__.py", line 7, in <module>
from .views import accounts
File "/home/mars/myapp/myapp/accounts/views.py", line 6, in <module>
from ..bot.tasks import my_task_bot
File "/home/mars/myapp/myapp/bot/tasks.py", line 14, in <module>
from myapp import celery
ImportError: cannot import name celery
Fatal error: local() encountered an error (return code 1) while executing 'python manage.py initdb'
我试图启动 manage.py
或 celery_worker
中的任何一个时出错 .
请建议 .
4 回答
我解决了这个错误,取消选中'在python路径中添加内容根'和'在python路径中添加soruce根到python路径'
您的导入逻辑不正确并导致循环依赖 . 不要在app.py中初始化芹菜,同时参考模块(
accounts
),该模块又导入celery
实例 .你有几个选择:
在app.py模块中删除app
accounts
的依赖项将celery初始化对象放入共享模块中,该模块不引用任何其他模块,但由
/*/tasks.py
子模块引用 .不要在任务中导入芹菜,而是使用
shared_task
装饰器 . 有关更多信息,请参阅docImportant: 不要忘记将芹菜应用程序正确链接到@shared_tasks . 应该在任何任务之前加载Celery应用程序 . 因此,在celery.py中定义celery初始化,然后在
myapp/__init__.py
加载它 .或者你可以详细说明这个link . 它显示了一个很好的方法来组织您的烧瓶应用程序与芹菜应用程序 .
tasks.py
https://docs.python.org/3.5/tutorial/modules.html#packages
在初始化Celery的文件中,将其添加为第一行 .
说明
from __future__ import absolute_import
意味着如果您导入芹菜,Python将寻找顶级芹菜模块,而不是current_package.celery . 这应该可以解决你得到的错误 . 但要确保安装了芹菜 . 很高兴提到芹菜必须安装 . 这适用于2.6之后的python版本