Pracují mimo kontext aplikace Baňky Celer

0

Otázka

Budu předmluvě se, že vím, že existuje několik řešení tohoto problému plovoucí kolem, ale žádný z nich, postupujte podle tohoto návodu zde a nezdá se, že odpověď na mou otázku.

Dostávám tuto chybu z mé Celer aplikace v Baňce.

[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 dlouhém řešení problémů, jsem v rozpacích. Kde se dá projít v aplikaci kontextu jak je uvedeno ve výjimce?


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

Očekává se zde s traceback, úkol se nezdaří a nikdy se nevrátí z backend. Já používám Ngnix, wsgi, Školitel sloužit - ale stejný problém existuje s nebo bez údajů tření pracovníků.

Jsem si jist, že je něco hloupé a triviální, že jsem se výhledem, i když jako obvykle - příliš slepý abych to viděl.

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

Nejlepší odpověď

0

Zjistil jsem, že opravu tady a jsem notating to pro ostatní s podobnou situací. To má co do činění s pracovní adresář, který vedoucí používá.

Šel jsem do adresáře mého baňky aplikace a plodil jeden pracovník ručně:

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

Běžel jsem můj baňky aplikace, jak je vidět v otázce, můj návrat otisky úspěšně. Moje situace je pravděpodobné, že Vedoucí nemá přístup k pracovní adresář, který používám. To není výslovně uvedeno, nicméně tento problém není popsána v nadřízeným docs opravdu, když nadřízený zprávy je spuštěn jako root - to lži!

Upravit přidat:

V dalším úkolem, jsem potřeboval přidat with app.app_context(): než něco dělat. To je divné, ale funguje to. Pokud má někdo vysvětlení, proč aplikace kontext existuje pouze po s, to by mohlo vést ke zdravé diskusi.

2021-11-24 19:09:10

V jiných jazycích

Tato stránka je v jiných jazycích

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