Flaskのコンテキスト

1247 ワード

本文は作者の独学のために使うだけで、システムはmacOSで、情報の正確さを保証しません.
Flaskのコンテキスト使用
Javaやpythonなどoo言語に慣れている人は、flaskのプライマリファイルにapp = Flask(__name__)にメンバー変数や初期化関数を追加できない理由に悩んでいるかもしれません.私もこの問題に興味を持っています.同時に、この需要を解決することを望んでいますが、残念ながら何も得られません.メンバー変数や初期化関数を書くことができないと問題になります.それはwebです.pyこのプログラムでは、クラスをインスタンス化する必要がある場合は、最外層に書く必要があります.システムが起動すると実行が開始され、多くの問題が発生します.
  • が初期化されたクラスでfrom flask import current_appが使用されるとエラーが発生します.このクラスを初期化するときにこのappが本当に開いていないので、current_appは見つかりません.これはプログラムでよく見られるエラータイプで、A初期化にはインスタンス化Bが必要であり、B初期化にはインスタンス化Aが必要であり、互いに依存している.
  • サーバを起動するときに、新しいプロセスを同時に起動してバックグラウンドプログラムを実行する必要がある場合(例えば、データベースから新しいデータがあるかどうかを問い合わせるプログラムを起動し、ある場合はキャプチャして処理するか、あるいはタイミングタスクなど)は、サービスがまだ完全に起動していない場合に開始し、ある場合、サーバが存在しない、タイミングタスクが失敗するなどのエラーを引き起こす可能性があります.

  • ここで提案したソリューションは第1のケースのみを解決することができ,第2のケースは後でソリューションを発見しても補完する.ここではapp.app_context()を使います.
    app = Flask(__name__)
    with app.app_context():
        db = Database()
        re = db.get_redis()
        conn = db.get_mongo()
        config = Config()
    
    with app.app_context():文では、サービスが本当に走っていなくてもappインスタンスがすでに存在しており、ここでappインスタンスが下のクラス初期化関数に何らかの方法で伝達されることで、これらのクラスでcurrent_appを読み取ることができないという問題を解決することができ、コードが正しく実行される.