3

だから私は基本的なFlaskのチュートリアルを進めていて、彼らのコードを見ていると、このスニペットがあります:

 @app.teardown_appcontext
 def close_db_connection(exception):
    """Closes the database again at the end of the request."""
    top = _app_ctx_stack.top
    if hasattr(top, 'sqlite_db'):
        top.sqlite_db.close()

さて、私が彼らのマニュアルを読んだところによると、関数「app.teardown_appcontext」は、コールバックの 1 つが予期しない動作をするたびに呼び出されます。関数をデコレートすると、元の関数に機能を追加できます。または、少なくともそれがデコレーターから理解していることです。しかし、私がこれを行うと:

@app.teardown_appcontext
def stack_overflow_rocks(exception):
    """Closes the database again at the end of the request."""
    top = _app_ctx_stack.top
    if hasattr(top, 'sqlite_db'):
        top.sqlite_db.close()

それはまだ動作します。Flask はこれをどのように管理しますか?

私の推測では、「flaskr.py」ファイルをすべてのメイン コードで実行すると、装飾された関数がコードに関連付けられ、必要に応じて呼び出されると思います。私の解釈が間違っているかどうかを確認するために、デコレータに関する多くの情報源を読んでみましたが、間違いを見つけることができませんでした。

4

1 に答える 1

5

コードでわかるように、デコレータは、それで装飾する関数を、オブジェクト インスタンス (この場合)の関数のリスト ( self.teardown_appcontext_funcs) に追加します。appcontext が破棄されると、このリストは逆の順序で反復処理されます。各関数に渡される例外は、ティアダウンをトリガーするか、何も発生しない場合はプレースホルダー例外になります。これは で発生します。FlaskappFlask.do_teardown_appcontext()

于 2013-05-14T13:30:11.110 に答える