De lucru în afara contextului aplicației Balon de Telina

0

Problema

Eu va prefața cu care știu că există câteva soluții pentru această problemă plutesc în jurul, deși nici unul dintre ei urmați acest ghid aici și nu par să-mi răspunzi la întrebare.

Am primit aceasta eroare din Telina aplicație în Balon.

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

După mai mult de depanare, eu sunt la o pierdere completă. În cazul în care face o trecere în app context se face referire în excepție?


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

Cum era de așteptat aici cu acest traceback, sarcina va eșua și nu se mai întorc de la backend. Eu sunt, folosind Ngnix, wsgi, Supraveghetor pentru a servi aceasta - deși aceeași problemă există cu sau fără supraveghetor de depunere a icrelor de muncitori.

Eu sunt sigur că este ceva stupid și banal că eu sunt cu vedere, deși, ca de obicei, prea orb pentru a vedea.

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

Cel mai bun răspuns

0

Am găsit fix aici și mă voi nota pentru alții cu o situație similară. Acest lucru are de-a face cu directorul de lucru care supervizorul este folosind.

M-am dus în directorul de balon mea aplicație și a dat naștere unui singur muncitor manual:

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

Am dat vasul meu app cum se vede în cauză, la întoarcerea mea printuri cu succes. Situația mea este probabil Supervizorul nu are acces la directorul de lucru care eu sunt, folosind. Nu este afirmat în mod explicit cu toate acestea, această problemă nu este discutat în supervizorul docs într-adevăr, deși supraveghetor rapoarte este fie rulat ca root - s minciuni!

Editare pentru a adăuga:

Într-o altă sarcină, am nevoie pentru a adăuga with app.app_context(): înainte de a face ceva. Care este ciudat pentru mine, dar funcționează. Dacă cineva are o explicație de ce app context există doar după cu, ar putea duce la o discuție sănătoasă.

2021-11-24 19:09:10

În alte limbi

Această pagină este în alte limbi

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