10

私の Flask-App では、次のようなビュー関数を定義しました。

@app.route("/some/restricted/stuff")
@login_required
def main():
    return render_template("overview.html",
                       stuff = getstuff() )

デコレータは次のように定義されます。

def login_required(something):
    @wraps(something)
    def wrap(*args, **kwargs):
        if "some_admin_name" in session:
            return something(*args, **kwargs)
        else:
            flash("\"You shall not pass!\" - Gandalf")
            return redirect(url_for("login"))
    return wrap

このコードが使用されているが説明されていないいくつかのソースを見つけたので、基本的にそれをコピーして貼り付けました。

そのコードが何をするのかを理解するのは非常に簡単です: 各リクエストに対して app.route() の後、main() の前に呼び出されるデコレーターを使用でき、アクティブなログインのチェックなどを行うことができます。

したがって、Flask/Python の初心者として、特にこれがどのように機能するかを知りたいと思います:
- 引数「何か」とは何ですか? それがリクエスト?!
- args と kwargs (キーワード引数?) とは何ですか?
- これをデコレータとして使用するには、メソッドをメソッドの内側にラップする必要があるのはなぜですか?
- これはフラスコでのみ使用できますか? そのような何かが便利になる可能性のある他の状況はありますか?

4

3 に答える 3

1

デコレーターの紹介:ここで読むことができます。

args と kwargs (キーワード引数?) とは何ですか?

args関数に渡される引数の数がわからない場合。

random(*args)
random('d', 'c', 'b')
random('a', 'e', 'f','z')

kwargs: 名前付き引数。基本的に上記のように、辞書を渡すようなものです。

random(**kwargs)
random(a="a", b='test', c='ab')

これをデコレータとして使用するには、メソッドをメソッド内にラップする必要があるのはなぜですか?

リンクデコレータのリンクを確認してください。

これはフラスコでのみ使用できますか? そのような何かが便利になる可能性のある他の状況はありますか?

いいえ、デコレータは一般的に Python で利用できます。フラスコだけに限定されません。ロギング、同期、およびその他の多くの用途に使用できます。Django では、デコレータを使用して、または login_required などを使用して、投稿または取得要求を許可できます...

于 2013-11-05T20:18:48.713 に答える