PythonのFlaskでルーティングパスを指定するには「固定の文字列」で階層も決まったものでないとルーティングできません。
今回はこのルーティングパスをディレクトリ名も階層(/でつなぐ数)も自由にルーティングする方法を検討します。
PythonのFlaskで階層自由なURLをルーティングする
PythonのFlaskでルーティングパスを指定するには通常は
@app.route('/login', methods=[ "GET", "POST" ]) def login(): #ログインの処理 login_func()
のように指定することでブラウザーから「http://localhost/login」のようにアクセスできるようになります。
この使い方が普通で、アプリケーション上でURLのパスは決まっているので、本来はあまり問題になりません。
しかも階層(/でつなぐ数)を決めてしまえばURLのパス名を動的に変更することもできます。
@app.route('/<name>') def name_path(name): print( "url={}".format( request.url )) return "name={}".format( name ) @app.route('/<name1>/<name2>') def name_paths(name1, name2): print( "url={}".format( request.url )) return "name={}/{}".format( name1, name2 )
のように「name」「name1」「name2」にはユーザーがブラウザーで
- http://localhost/name
(@app.route(‘/<name1>’) がルーティングされる) - http://localhost/name1/name2
(@app.route(‘/<name1>,<name2>’) がルーティングされる)
と入力することで、それぞれに対応したパスがルーティングされます。
これでもいいのですが、URL階層が増えるたびに「@app.route・・・」を増やさなければなりません。
これを何階層のものが来ても対応したい、ということです。
階層自由なルーティング
何階層でも自由なURLパスをルーティングすると言うことは
- http://localhost/file1
- http://localhost/dir1/file1
- http://localhost/dir1/dir2/file1
- http://localhost/dir1/dir2/dir3/file1
といったものすべてを動的にルーティングしてしまおうと言うことです。
通常に「@app.route・・・」を書いても存在しない階層のURLを指定すると「404 NOT FOUND」になるので、ひと工夫が必要です。
具体的にはpathというフィルターを使用します。
@app.route('/<path:path>') def free_path( path ) : print( "url={}".format( request.url )) return "path ={}".format( path )
とします。
これで
- http://localhost/file1
- http://localhost/dir1/file1
- http://localhost/dir1/dir2/file1
- http://localhost/dir1/dir2/dir3/file1
といったすべての階層のURLもルーティングされます。
まとめ
PythonのFlaskで動的な階層のURLをルーティングするにはpathというフィルターを利用すると簡単に実現できます。
以上、PythonのFlaskで階層自由なURLをルーティングする方法でした。