Travail en dehors du contexte de l'application Flacon de Céleri

0

La question

Je vais préface avec qui je sais qu'il existe quelques solutions pour ce problème flottant autour, mais aucun d'entre eux suivez le guide ici et ne semblent pas répondre à ma question.

Je reçois cette erreur de ma Céleri application dans le Flacon.

[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.

Après beaucoup de dépannage, je suis à une perte complète. D'où un passage dans l'app contexte tel que référencé dans l'exception?


     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()

Comme prévu ici avec cette traceback, la tâche de l'échec et de ne jamais revenir de l'arrière-plan. Je suis à l'aide de Ngnix, wsgi, Superviseur de servir ce - que le même problème existe avec ou sans superviseur de frai pour les travailleurs.

Je suis sûr que c'est quelque chose de stupide et insignifiant que je suis dominant, même si, comme d'habitude, trop aveugle pour le voir.

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

La meilleure réponse

0

J'ai trouvé la solution ici et je suis la notation pour les autres à une situation similaire. Cela a à voir avec le répertoire de travail est le superviseur de l'utiliser.

Je suis allé dans le répertoire de mon flacon d'application et donné naissance à un seul travailleur manuellement:

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

J'ai couru mon flacon d'application comme on le voit dans la question, mon retour s'imprime correctement. Ma situation est susceptible Superviseur n'a pas accès au répertoire de travail dont je suis l'aide. Il n'est pas explicitement indiqué cependant cette question n'est pas abordée dans le superviseur de docs vraiment, bien que superviseur des rapports qu'il est en train d'être exécuté en tant que root - il se trouve!

Modifier pour ajouter:

Dans une autre tâche, j'ai besoin d'ajouter with app.app_context(): avant de faire quoi que ce soit. C'est bizarre pour moi, mais il fonctionne. Si quelqu'un a une explication du pourquoi de l'application de contexte, qu'après le avec des, elle pourrait conduire à une bonne discussion.

2021-11-24 19:09:10

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................