1. ホーム
  2. python

[解決済み] Flask のパスルールで末尾のスラッシュが 404 を誘発する。

2023-01-15 02:47:38

質問

の下にある任意のパスをリダイレクトしたい。 /users の下にある任意のパスを静的アプリにリダイレクトしたいのです。 次のビューはこれらのパスをキャプチャして、適切なファイルを提供する必要があります (この例ではパスを表示するだけです)。 これは /users , /users/604511 そして /users/604511/action . なぜ、パス /users/ は 404 エラーを引き起こすのでしょうか?

@bp.route('/users')
@bp.route('/users/<path:path>')
def serve_client_app(path=None):
    return path

どのように解決するのですか?

あなたの /users ルートには末尾のスラッシュがありません。これは Werkzeug が末尾のスラッシュをマッチさせないという明示的なルールとして解釈します。 末尾のスラッシュを追加して、Werkzeug が url に末尾のスラッシュがない場合にリダイレクトするか、あるいは strict_slashes=False を設定すると、Werkzeug はスラッシュの有無に関わらずそのルールにマッチします。

@app.route('/users/')
@app.route('/users/<path:path>')
def users(path=None):
    return str(path)

c = app.test_client()
print(c.get('/users'))  # 302 MOVED PERMANENTLY (to /users/)
print(c.get('/users/'))  # 200 OK
print(c.get('/users/test'))  # 200 OK

@app.route('/users', strict_slashes=False)
@app.route('/users/<path:path>')
def users(path=None):
    return str(path)

c = app.test_client()
print(c.get('/users'))  # 200 OK
print(c.get('/users/'))  # 200 OK
print(c.get('/users/test'))  # 200 OK


また strict_slashes をすべての URL に対して設定することもできます。

app.url_map.strict_slashes = False

しかし、ほとんどの場合において、厳密なスラッシュを無効にすることは避けるべきでしょう。docsにその理由が書かれています。

この動作により、たとえ末尾のスラッシュが省略されても相対 URL は動作し続け、Apache や他のサーバの動作と一致するようになります。また、URL は一意であり続けるので、検索エンジンが同じページを 2 回インデックスすることを避けることができます。