Di lavoro al di fuori del contesto di applicazione Pallone Sedano

0

Domanda

Io con prefazione che so che ci sono un paio di soluzioni per questo problema galleggianti intorno, anche se nessuno di loro di seguire questa guida qui e non sembrano rispondere alla mia domanda.

Ricevo questo errore mio di Sedano app in Pallone.

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

Dopo tanto risoluzione dei problemi, io sono in una perdita completa. Dove si fa a passare in app contesto di riferimento l'eccezione?


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

Come previsto qui con questo traceback, l'operazione avrà esito negativo e non tornare più dal backend. Sto usando Ngnix, wsgi, Soprintendente per servire questo - anche se lo stesso problema esiste con o senza supervisore di deposizione delle uova di lavoratori.

Sono sicuro che è qualcosa di stupido e banale che io sono con vista, anche se, come al solito, troppo ciechi per vedere.

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

Migliore risposta

0

Ho trovato il fix qui e sono notazione per gli altri con una situazione simile. Questo ha a che fare con la directory di lavoro che il supervisore è in uso.

Sono andato nella directory del mio pallone app e ha generato un singolo lavoratore manualmente:

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

Ho eseguito il mio pallone app come si è visto nella domanda, il mio ritorno viene stampata correttamente. La mia situazione è probabile che il Supervisore non hanno accesso alla directory di lavoro che sto usando. Non è esplicitamente dichiarato, tuttavia, questo non è un problema discusso in soprintendente docs davvero, anche se supervisore report viene eseguito come root - si trova!

Edit per aggiungere:

In un'altra operazione, avevo bisogno di aggiungere with app.app_context(): prima di fare qualsiasi cosa. Che è strano per me, ma funziona. Se qualcuno ha una spiegazione del perché l'app contesto esiste solo dopo che il con, potrebbe portare ad una sana discussione.

2021-11-24 19:09:10

In altre lingue

Questa pagina è in altre lingue

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