Я начну с того, что я знаю, что есть несколько решений этой проблемы, хотя ни одно из них не следует этому руководству здесь и, похоже, не отвечает на мой вопрос.
Я получаю эту ошибку из своего приложения для сельдерея в колбе.
[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, Супервизор для обслуживания этого - хотя та же проблема существует с супервизором или без него, порождающим работников.
Я уверен, что это что - то глупое и тривиальное, что я упускаю из виду, хотя, как обычно, слишком слеп, чтобы это увидеть.