ImportError:无法导入名字芹菜

nml*_*nml 2 python celery flask

我正在尝试使用Celery + Redis + Flask运行一些后台作业。

我的应用程序结构为:

myapp/
  celery_worker.py
  manage.py
  myapp/
    __init__.py
    app.py
    bot/
      __init__.py
      tasks.py
    accounts/
      views.py
Run Code Online (Sandbox Code Playgroud)

我将芹菜初始化为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()
Run Code Online (Sandbox Code Playgroud)

然后开始工作 celery_worker.py

from myapp import create_app, celery

app = create_app()
app.app_context().push()
Run Code Online (Sandbox Code Playgroud)

tasks.py 包含

from myapp import celery

@celery.task(name='my_task_bot')
def my_task_bot():
     # pass
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试通过以下导入将任务从task.py访问到account / views.py时:

from ..bot.tasks import my_task_bot
Run Code Online (Sandbox Code Playgroud)

ImportError: cannot import name celery出错了。

无论如何,我尝试在哪里导入任务,都会出现此错误。该celery实例似乎是在app.py中初始化的实例,但未导入。

PS:我遵循的是https://github.com/ezequielo/flask_celery_exp仓库的模式,它可以正常工作。但不是我的应用程序。

编辑:

这是回溯:

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'
Run Code Online (Sandbox Code Playgroud)

我在尝试启动任一manage.py或时遇到错误celery_worker

请提出建议。

Rus*_*m K 6

您的导入逻辑不正确,并导致循环依赖。不要在app.py中初始化celery,同时不要引用accounts依次导入celery实例的模块()。

您有几种选择:

  1. accountsapp.py模块上的app删除依赖项

  2. 将celery初始化对象放入不引用任何其他模块,但/*/tasks.py被子模块引用的共享模块中。

  3. 不要在任务中导入芹菜,而要使用shared_task装饰器。有关更多信息,请参阅doc

重要提示:不要忘记将celery应用程序正确链接到您的@shared_tasks。在执行任何任务之前,应先加载Celery应用程序。因此,请在celery.py中定义celery初始化,然后将其加载到myapp/__init__.py

from __future__ import absolute_import

from .celery import app as celery_app  # noqa
Run Code Online (Sandbox Code Playgroud)

或者,您可以在此链接上详细说明。它显示了组织烧瓶应用程序和芹菜应用程序的好方法。