Pracujú mimo aplikácie kontexte Banky Zeler

0

Otázka

Budem predslov s, že viem, že existuje niekoľko riešení tohto problému plávajúce okolo, aj keď žiadna z nich postupujte podľa tohto návodu tu a nezdá sa, že odpoveď na moju otázku.

Dostávam to chyba z mojej Zeler aplikáciu v Banku.

[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 veľa problémov, som na úplnej straty. Kde sa dá prejsť in-app kontexte ako uvádzaný v výnimka?


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

Tak, ako sa očakáva tu s týmto traceback, úloha zlyhá a nikdy nevráti z backendu. Ja používam Ngnix, štandardná, Správcu slúžiť tento - hoci rovnaký problém existuje s alebo bez dohľadu trenia pracovníkov.

Som si istý, že je to niečo hlúpe a triviálne, že som výhľadom, hoci podľa obvyklých - príliš slepí to vidieť.

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

Najlepšiu odpoveď

0

Našiel som opraviť tu a som notating to pre iných podobných situácii. To má čo do činenia s pracovný adresár, že vedúci je pomocou.

Išiel som do adresár mojej banky app a splodil jeden pracovník manuálne:

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

Bežal som moje banková aplikácia, ako je vidieť na otázku, môj návrat vytlačí úspešne. Moja situácia je pravdepodobne Správcu nemá prístup na pracovný adresár, ktorý používam. To nie je výslovne uvedené, však tento problém nie je predmetom v supervisor docs naozaj, keď správcu správ, ktoré je spustené ako root - leží!

Upraviť a pridať:

V inej úlohe, musel som pridať with app.app_context(): pred robíte čokoľvek. To je zvláštne na mňa, ale funguje to. Ak má niekto vysvetlenie, prečo app kontexte existuje len po s, mohlo by to viesť k zdravému diskusiu.

2021-11-24 19:09:10

V iných jazykoch

Táto stránka je v iných jazykoch

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