Как настроить колбу + сельдерей со структурой на основе приложения? - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь настроить приложение фляги с сельдереем, используя структуру на основе подразделения (или приложения), где каждое "приложение" может (или не может) иметь фоновые задачи

  +---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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...