PythonのFlaskで階層自由なURLをルーティングする方法

記事内に広告が含まれています。

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をルーティングする方法でした。

タイトルとURLをコピーしました