Uygulama kapsamı dışında çalışma Flask Kereviz

0

Soru

Önsözde, bu sorunun etrafında yüzen birkaç çözüm olduğunu biliyorum, ancak hiçbiri bu kılavuzu burada takip etmiyor ve soruma cevap vermiyor gibi görünüyor.

Bu hatayı Flask'taki Kereviz uygulamamdan alıyorum.

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

Çok fazla sorun giderme işleminden sonra tamamen kayboldum. Tek seferde istisna olarak belirtilen yerde uygulaması kapsamında mı?


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

Bu geri dönüşte beklendiği gibi, görev başarısız olur ve arka uçtan asla geri dönmez. Buna hizmet etmek için Ngnix, wsgı, Supervisor kullanıyorum - aynı sorun, işçileri üreten süpervizörle veya süpervizör olmadan da var.

Her zamanki gibi göremeyecek kadar kör olmama rağmen, göz ardı ettiğim aptalca ve önemsiz bir şey olduğuna eminim.

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

En iyi cevabı

0

Düzeltmeyi burada buldum ve benzer bir duruma sahip başkaları için yapmıyorum. Bu, süpervizörün kullandığı çalışma dizini ile ilgilidir.

Flask uygulamamın dizinine girdim ve tek bir çalışanı manuel olarak oluşturdum:

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

Soruda görüldüğü gibi flask uygulamamı çalıştırdım, geri dönüşüm başarıyla yazdırılıyor. Benim durumum büyük olasılıkla Süpervizörün kullandığım çalışma dizinine erişimi yok. Açıkça belirtilmemiştir, ancak bu sorun supervisor dokümanlarında gerçekten tartışılmamaktadır, ancak supervisor root olarak çalıştırıldığını bildirmektedir-yalan söylüyor!

Eklemek için düzenle:

Başka bir görevde, eklemem gerekiyordu with app.app_context(): bir şey yapmadan önce. Bu bana garip geliyor ama işe yarıyor. Uygulama bağlamının neden yalnızca wıt'den sonra var olduğuna dair bir açıklaması varsa, bu sağlıklı bir tartışmaya yol açabilir.

2021-11-24 19:09:10

Diğer dillerde

Bu sayfa diğer dillerde

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