3

どうやら、Flaskのapp.route/app.add_url_ruleはクロージャーでは機能しません。たとえば、次のコマンドを使用して基本的なアプリを作成します。

for name in ('/hi', '/bye'):
    app.add_url_rule(name, view_func=lambda: name)

クエリして、

dev:~/pg/yelp-main> curl localhost:9113/hi
/bye

クロージャーでは機能しないことを示しています。これを回避する最も簡単な方法は何ですか?Pythonに実際に2つの関数を作成させることはできますか?

4

1 に答える 1

6

:のを保持するクロージャをコードに実際に作成していません。name

view_func=lambda: name  # <- points at the *symbol*, which holds the *last* value
# in the case of a loop

を保持するには、値をクロージャーに渡す必要があります。

view_maker = lambda name: (lambda: name)

for name in ('/hi', '/bye'):
    endpoint = name.replace("/", "")
    app.add_url_rule(name, view_func=view_maker(name), endpoint=endpoint)

編集:さらに、を使用して関数を登録するたびにadd_url_rule、を指定するendpointか、各関数が一意であることを確認する必要があります__name__(Flaskはendpoint、関数のから派生した、にキー設定された辞書にルートを実際に格納するため)__name__他に提供されていない場合)。そうしないと、2番目のビューが最初のビューを上書きします。

Flaskのクラスベースのビューを調べたいと思うかもしれません-それらはあなたが探しているダイナミクスを構築するのをより簡単にするかもしれません(クロージャとクラスは非常に似ていますが[どちらも貧乏人の代わりになります])。

于 2012-12-05T23:19:54.970 に答える