108

このような2つのURLルールがある場合、既存のエンドポイント関数を上書きできない理由を誰かが知っていますか?

app.add_url_rule('/',
                 view_func=Main.as_view('main'),
                 methods=["GET"])

app.add_url_rule('/<page>/',
                 view_func=Main.as_view('main'),
                 methods=["GET"])

トレースバック:

Traceback (most recent call last): 
  File "demo.py", line 20, in <module> methods=["GET"]) 
  File ".../python2.6/site-packages/flask‌​/app.py", 
    line 62, in wrapper_func return f(self, *args, **kwargs) 
  File ".../python2.6/site-packages/flask‌​/app.py", 
    line 984, in add_url_rule 'existing endpoint function: %s' % endpoint)  
AssertionError: View function mapping is overwriting an existing endpoint 
    function: main
4

14 に答える 14

9

Flask では、単一の「ビュー関数」を「エンドポイント」に関連付ける必要があります。2回呼び出しMain.as_view('main')て、2つの異なる関数を作成しています(機能はまったく同じですが、メモリシグネチャが異なります)。短編小説、あなたは単純にすべきです

main_view_func = Main.as_view('main')

app.add_url_rule('/',
             view_func=main_view_func,
             methods=["GET"])

app.add_url_rule('/<page>/',
             view_func=main_view_func,
             methods=["GET"])
于 2013-08-04T00:23:47.540 に答える
4

@wraps(f)ラッパー関数の上に追加すると、問題が解決しました。

def list_ownership(f):
    @wraps(f)
    def decorator(*args,**kwargs):
        return f(args,kwargs)
    return decorator
于 2020-10-26T09:01:30.913 に答える
1

最近導入された Flask issue #570 (flask 0.10) の修正により、この例外が発生します。

https://github.com/mitsuhiko/flask/issues/796を参照

したがって、flask/app.py に移動して 948..951 の 4 行をコメント アウトすると、問題が新しいバージョンで完全に解決されるまで、これが役立つ場合があります。

その変更の差分はこちら: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1

于 2013-07-19T11:29:47.763 に答える
0

同じビュー メソッドを指している場合でも、ビュー名は一意である必要があります。そうしないと、functools インポート ラップから追加して @wraps https://docs.python.org/2/library/functools.htmlを使用できます。

于 2019-05-30T09:25:47.350 に答える