Trabalhando fora do contexto de aplicação Frasco de Aipo

0

Pergunta

Eu prefácio com que eu sei que existem algumas soluções para este problema flutuando, embora nenhum deles siga este guia aqui e não parecem responder a minha pergunta.

Eu estou recebendo este erro da minha Aipo app no Frasco.

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

Depois de muito resolução de problemas, eu estou em uma perda completa. Onde faz uma passagem em contexto de aplicativo como referenciado no exceção?


     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 aqui, espera-se com este controle, a tarefa irá falhar e nunca mais voltar a partir do back-end. Eu estou usando Ngnix, wsgi, Supervisor, para atender a este - que o mesmo problema existe com ou sem supervisor de desova de trabalhadores.

Tenho certeza de que isso é algo simples e trivial que eu estou vista, embora, como por costume - cegos demais para ver isso.

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

Melhor resposta

0

Eu encontrei a correção aqui e estou registrando para os outros com uma situação semelhante. Isso tem a ver com o diretório de trabalho que o supervisor está a utilizar.

Eu fui para o diretório do meu frasco de app e gerado um único trabalhador manualmente:

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

Eu corri minha frasco de aplicação, como visto na questão, o meu retorno é impresso com êxito. A minha situação é provável que o Supervisor não tem acesso para a pasta de trabalho que eu estou usando. Não é declarado explicitamente no entanto, este problema não é discutido no supervisor docs realmente, apesar de supervisor de relatórios está a ser executado como root - é mentira!

Editar para adicionar:

Em outra tarefa, eu precisava adicionar with app.app_context(): antes de fazer qualquer coisa. Que é estranho para mim, mas funciona. Se alguém tem uma explicação para a razão de contexto de aplicativo só existe depois que o com, isso pode levar a uma saudável discussão.

2021-11-24 19:09:10

Em outros idiomas

Esta página está em outros idiomas

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