Trabajando fuera de contexto de la aplicación Matraz de Apio

0

Pregunta

Voy prefacio con el que sé que hay un par de soluciones para este problema flotando en el aire, aunque ninguno de ellos siga esta guía aquí y no parece responder a mi pregunta.

Estoy recibiendo este error de mi Apio aplicación en el Matraz.

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

Después de mucho resolución de problemas, estoy en una pérdida completa. ¿Dónde puede uno pasar en el contexto de la aplicación que se hace referencia en la excepción?


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

Como era de esperar aquí con este rastreo, la tarea fallará y no volver nunca desde el backend. Estoy usando Ngnix, wsgi, Supervisor de servir a esta - a pesar de que el mismo problema existe con o sin supervisor de desove de los trabajadores.

Estoy seguro de que es algo tonto y trivial que estoy vistas, aunque como es habitual - demasiado ciego para ver.

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

Mejor respuesta

0

He encontrado la solución aquí y estoy notando que para los demás con una situación similar. Esto tiene que ver con el directorio de trabajo que el supervisor está utilizando.

Me fui en el directorio de mi frasco de aplicación y dio lugar a un solo trabajador de forma manual:

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

Me encontré con mi frasco de aplicación como se ha visto en la pregunta, mi regreso se imprime correctamente. Mi situación es probable que el Supervisor no tiene acceso al directorio de trabajo que estoy utilizando. No es explícitamente sin embargo este tema no se discute en supervisor docs realmente, a pesar de que el supervisor de informes se ejecuta como root - que se encuentra!

Editar para agregar:

En otra tarea, tuve que agregar with app.app_context(): antes de hacer nada. Que es extraño para mí, pero funciona. Si alguien tiene una explicación de por qué la aplicación de contexto sólo existe después de la con, que podría llevar a una discusión sana.

2021-11-24 19:09:10

En otros idiomas

Esta página está en otros idiomas

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