次のような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
Flaskは単一の'view関数'を'エンドポイント'と関連付けることを要求します。あなたはMain.as_view('main')
を2回呼び出していますが、これは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"])
最近(flask 0.10)に導入されたFlask issue #570には、この例外を発生させる修正があります。
https://github.com/mitsuhiko/flask/issues/796 をご覧ください。
そこで、flask/app.pyに行き、948~951行目をコメントアウトすると、この問題が新しいバージョンで完全に解決されるまでの間、助けになるかもしれません。
この変更の差分はこちらです: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1