Praca poza kontekstem aplikacji Kolba z selerem

0

Pytanie

Zacznę od tego, że wiem, że istnieje kilka rozwiązań tego problemu, chociaż żaden z nich nie należy tej instrukcji tutaj i, jak się wydaje, nie odpowiada na moje pytanie.

Otrzymuję ten błąd z aplikacji do selera w kolbie.

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

Po długich poszukiwaniach i rozwiązywania problemów jestem beznadziejna. Gdzie jest przekazywana w kontekście aplikacji, jak określono w wyjątku?


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

Zgodnie z oczekiwaniami tutaj z tej opinii, zadanie zakończy się niepowodzeniem i nigdy nie wróci z zaplecza części. Używam Ngnix, wsgi, Superwizor do obsługi tego - choć ten sam problem istnieje od kontrolera lub bez niego, порождающим pracowników.

Jestem pewien, że to głupie i banalne, co mi umyka z oczu, chociaż, jak zwykle, zbyt ślepy, by to zobaczyć.

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

Najlepsza odpowiedź

0

Znalazłem rozwiązanie tutaj i obchodzę go do innych z podobną sytuacją. Jest to związane z folderem roboczym, który wykorzystuje superwizor.

Wszedłem do katalogu aplikacji flask i ręcznie stworzył jednego pracownika:

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

I rozpoczęła swoją aplikację do kolby, jak wynika z pytania, mój powrót z powodzeniem jest drukowany. Moja sytuacja najprawdopodobniej polega na tym, że przełożony nie może uzyskać dostępu do pulpitu katalogu, który używam. To wyraźnie zaznaczono, jednak ten problem w rzeczywistości nie jest omawiany w dokumentach administratora, chociaż superwizor informuje, że jest uruchamiany jako root - to kłamstwo!

Edytuj, aby dodać:

W drugim zadaniu trzeba było dodać with app.app_context(): zanim coś robić. To dla mnie dziwne, ale działa. Jeśli ktoś ma jakieś wyjaśnienie, dlaczego kontekst aplikacji istnieje tylko po, to może doprowadzić do zdrowej dyskusji.

2021-11-24 19:09:10

W innych językach

Ta strona jest w innych językach

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