ImportError:无法导入名称 celery

2024-02-27

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

我的应用程序结构是:

myapp/
  celery_worker.py
  manage.py
  myapp/
    __init__.py
    app.py
    bot/
      __init__.py
      tasks.py
    accounts/
      views.py

我将 celery 初始化为 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 error.

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

PS:我遵循的模式https://github.com/ezequielo/flask_celery_exp https://github.com/ezequielo/flask_celery_exp回购并且工作正常。但不是我的应用程序。

Edit:

这是回溯:

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 or celery_worker.

请建议。


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

您有多种选择:

  1. 从应用程序中删除依赖项accounts在 app.py 模块中

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

  3. 不要在任务中导入 celery,而是使用shared_task装饰师。欲了解更多信息,请参阅doc http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-the-shared-task-decorator

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

from __future__ import absolute_import

from .celery import app as celery_app  # noqa

或者您可以详细说明这一点link https://github.com/inveniosoftware-attic/flask-appfactory/tree/master/examples/myapp。它展示了一种将 Flask 应用程序与 celery 应用程序一起组织的好方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ImportError:无法导入名称 celery 的相关文章

随机推荐