Работа вне контекста приложения Колба с сельдереем

0

Вопрос

Я начну с того, что я знаю, что есть несколько решений этой проблемы, хотя ни одно из них не следует этому руководству здесь и, похоже, не отвечает на мой вопрос.

Я получаю эту ошибку из своего приложения для сельдерея в колбе.

[2021-11-23 22:50:01,469: ERROR/ForkPoolWorker-1] Task smartful_versioning_flask.test_celery_task[6dda4a4b-cf64-4fdc-8317-237dca9ad31b] raised unexpected: RuntimeError('Working outside of application context.\n\nThis typically means that you attempted to use functionality that needed\nto interface with the current application object in some way. To solve\nthis, set up an application context with app.app_context().  See the\ndocumentation for more information.')
Traceback (most recent call last):
  File "/var/smartful_flask/smartful_venv/lib/python3.7/site-packages/celery/app/trace.py", line 450, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/var/smartful_flask/smartful_venv/lib/python3.7/site-packages/celery/app/trace.py", line 731, in __protected_call__
    return self.run(*args, **kwargs)
  File "/var/smartful_flask/smartful_versioning_flask.py", line 21, in test_celery_task
    return jsonify({"something": "something"})
  File "/var/smartful_flask/smartful_venv/lib/python3.7/site-packages/flask/json/__init__.py", line 336, in jsonify
    if current_app.config["JSONIFY_PRETTYPRINT_REGULAR"] or current_app.debug:
  File "/var/smartful_flask/smartful_venv/lib/python3.7/site-packages/werkzeug/local.py", line 422, in __get__
    obj = instance._get_current_object()
  File "/var/smartful_flask/smartful_venv/lib/python3.7/site-packages/werkzeug/local.py", line 544, in _get_current_object
    return self.__local()  # type: ignore
  File "/var/smartful_flask/smartful_venv/lib/python3.7/site-packages/flask/globals.py", line 47, in _find_app
    raise RuntimeError(_app_ctx_err_msg)
**RuntimeError: Working outside of application context.**

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.

После долгих поисков и устранения неполадок я в полной растерянности. Где передается в контексте приложения, как указано в исключении?


     from flask import Flask, jsonify
     from celery import Celery
     
     app = Flask(__name__)
     app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
     app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
     
     celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
     celery.conf.update(app.config)
     
     @celery.task
     def test_celery_task():
         return jsonify({"something": "something"})
     
     @app.route("/web/start/backend", methods=['POST'])
     def start_task():
         task = test_celery_task.apply_async()
         return task.id
     
     @app.route("/web/check-status/backend/<task_id>", methods=['GET'])
     def check_task(task_id):
         task = test_celery_task.AsyncResult(task_id)
     
         if task.state == 'PENDING':
             return jsonify({
                 "task": task_id,
                 "state": task.state,
                 "data": None,
                 "complete": False,
                 "error": False
             })
         elif task.state == 'SUCCESS':
             print(task.info)
         else:
             print(task.state)
     
         return "task.info"

    if __name__ == "__main__":
        app.run()

Как и ожидалось здесь с этой обратной связью, задача завершится неудачно и никогда не вернется с серверной части. Я использую Ngnix, wsgi, Супервизор для обслуживания этого - хотя та же проблема существует с супервизором или без него, порождающим работников.

Я уверен, что это что - то глупое и тривиальное, что я упускаю из виду, хотя, как обычно, слишком слеп, чтобы это увидеть.

celery flask python
2021-11-23 23:15:00
1

Лучший ответ

0

Я нашел решение здесь и отмечаю его для других с аналогичной ситуацией. Это связано с рабочим каталогом, который использует супервизор.

Я зашел в каталог своего приложения flask и вручную создал одного рабочего:

# smartful_venv/bin/celery --app=smartful_versioning_flask.celery worker --loglevel=DEBUG

Я запустил свое приложение для колбы, как видно из вопроса, мое возвращение успешно печатается. Моя ситуация, скорее всего, заключается в том, что у супервайзера нет доступа к рабочему каталогу, который я использую. Это явно не указано, однако эта проблема на самом деле не обсуждается в документах супервизора, хотя супервизор сообщает, что она запускается от имени root - это ложь!

Отредактируйте, чтобы добавить:

В другом задании мне нужно было добавить with app.app_context(): прежде чем что-то делать. Это странно для меня, но это работает. Если у кого-нибудь есть объяснение того, почему контекст приложения существует только после с, это может привести к здоровому обсуждению.

2021-11-24 19:09:10

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории