Flaskを使ってみる

URLパス変数とURLパラメータ


URLパス変数というのはURLの後ろに/で続けて記載する変数です。
http://192.168.10.15:8000/test1/hoge
のhogeがパス変数になります。

URLパラメータというのはURLの後ろに?で続けて記載する変数で「?名前=値」の書式です。
http://192.168.10.15:8000/test2?path=hoge
のpathがURL変数名、hogeがその値となります。
複数のパラメータを扱うことができます。
http://192.168.10.15:8000/test2?path=hoge&path2=fuga

紛らわしいですが全く動きが違います。
Flaskではどちらも扱うことができます。
# -*- coding: utf-8 -*-
from flask import Flask, request
app = Flask(__name__)

# http://192.168.10.15:8000
@app.route("/")
def hello():
    print("hello")
    return "Hello World!"

# URLパス変数
# http://localhost:8000/test1/hoge
@app.route("/test1/<path>")
def test1(path):
    print("path={}".format(path))
    return "test1 path={}".format(path)

# URLパラメータ
# http://localhost:8000/test2?path=hoge
@app.route("/test2")
def test2():
    path = request.args.get('path', default=None, type=str)
    print("path={}".format(path))
    return "test2 path={}".format(path)

if __name__ == "__main__":
    #app.run()
    print("app.url_map={}".format(app.url_map))
    app.run(host='0.0.0.0', port=8000, debug=True)



URLパス変数を使う場合、パス変数は関数の引数として渡ってきます。
パス変数を省略することはできません。
パス変数を省略するとエラーとなります。


一方、URLパラメータは省略時のデフォルトを指定することができます。
複数のURLパラメータを使う場合、全てのパラメータを指定する必要は有りません。
省略されたパラメータはデフォルト値が使われます。




URLパス変数を使う場合、階層構造を持つパス変数は指定することができません。
階層構造が有るパス変数はエラーとなります。


一方、URLパラメータは階層構造を持つことができます。
ファイルのフルパスなどはこちらを使う必要が有ります。




URLパス変数を使う場合、パス変数の型を指定することができます。
typeにstrを指定すると、パス変数は文字として扱われます。
# URLパラメータ
# http://localhost:8000/test2?path=hoge
@app.route("/test2")
def test2():
    path = request.args.get('path', default=None, type=str)
    print("path={} type={}".format(path, type(path)))
    return "test2 path={}".format(path)

typeにintを指定すると、パス変数は数値として扱われます。
ブラウザーで path=AA と指定するとエラーとはならずに、path=Noneとなります。
python3では変数の型判定が厳密になったので、必ず数値型として扱いたいときは便利な機能です。
# URLパラメータ
# http://localhost:8000/test2?path=hoge
@app.route("/test2")
def test2():
    path = request.args.get('path', default=None, type=int)
    print("path={} type={}".format(path, type(path)))
    return "test2 path={}".format(path)

続く...