Я пытаюсь настроить приложение фляги с сельдереем, используя структуру на основе подразделения (или приложения), где каждое "приложение" может (или не может) иметь фоновые задачи
+---datascience
| | app.py
| | blueprints.py
| | celery.py
| | celeryconfig.py
| | extensions.py
| | settings.py
| | __init__.py
| +---bar
| | | __init__.py
| | | tasks.py
| | | views.py
| | +---templates
| +---foo
| | | __init__.py
| | | tasks.py
| | | views.py
| | +---templates
| +---home
| | | __init__.py
| | | index.py
| | +---templates
| +---static
| +---templates
Внутри, datascience/app.py
У меня есть функция make_celery,
def make_celery(app=None, include=None):
app = app or create_app()
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL'],
config_source='datascience.celeryconfig'
# include=include
)
celery.conf.update(app.config)
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
return celery
В datascience/celery.py
Я создаю экземпляр с помощью функции make_celery
from .app import make_celery
celery = make_celery()
Однако у меня возникают проблемы с работой работника сельдерея.
Я запускаю celery worker -A datascience.celery:celery -l info
(из каталога выше datascience
Я получаю трассировку как
File "\myapp\datascience\hello\view.py", line 5, in <module> from .tasks import hello as _hello
File "\myapp\datascience\hello\tasks.py", line 2, in <module>\ from datascience.celery import celery
ImportError: cannot import name 'celery'
Мой datascience\hello\tasks.py
выглядит как
from datascience.celery import celery
@celery.task
def hello(name):
return "Hello " + name
и datascience\hello\view.py
выглядит как,
from datascience.blueprints import celery_test
from .tasks import hello as _hello
@celery_test.route('/')
def hello():
name = request.args.get('name', 'john doe')
result = _hello.delay(name)
result.wait()
return render_template('hello.html', result=result)
Я могу запустить свое приложение фляги и перейти к маршрутам, на которых у меня нет задач с сельдереем, но я не могу запустить работника с сельдереем.
ОБНОВЛЕНИЯ:
В datascience/celery.py
я обновил его, как объяснено здесь . Мне удалось запустить их пример, если я переместил задачи в proj/foo/tasks
и установил include=['proj.foo.tasks']
, в этом случаеЯ запустил пример, все работало нормально, поэтому я сделал следующие обновления в своем проекте.
from .factory import make_celery
imports = ['datascience.hello.tasks']
celery = make_celery(include=imports)
В котором я также обновилмоя make_celery
функция для приема include
kwarg.Теперь у меня есть datascience/celery.py
, а также datascience/hello/tasks.py
для моего приложения hello world.Теперь, если я запускаю celery -A datascience worker -l info
, я получаю AttributeError: module 'datascience' has no attribute 'celery'
, а до этого я получаю AttributeError: module 'datascience' has no attribute 'app'
.
Если я запускаю celery -A datascience.celery worker -l info
, я получаю ту же ошибку, что и выше.
File "\myapp\datascience\hello\view.py", line 5, in <module> from .tasks import hello as _hello
File "\myapp\datascience\hello\tasks.py", line 2, in <module>\ from datascience.celery import celery
ImportError: cannot import name 'celery'