• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar

Tech Life

エンジニアの生き方を考えるメディア

  • プログラミング
    • Python入門
    • Flask入門
    • Django入門
  • 利用規約
  • プロフィール
You are here: Home / IT・プログラミング / Python / フレームワーク / Flask / FlaskでURLマッピング(ルーティング)詳細、GETリクエストで値を渡す方法まとめ。

FlaskでURLマッピング(ルーティング)詳細、GETリクエストで値を渡す方法まとめ。

2020年11月26日 by 9nmatsumoto

この記事では

  • Flaskで簡単なルーティングをする方法
  • 値を渡す動的なルーティング、値の種類
  • 複数の値を渡す動的なルーティング
  • HTTPメソッド(GET,POST,PUT)に応じたルーティングの方法
  • 複数のURLに対して同一の関数を対応させるルーティング

について、必要なだけ、詳細に説明します。

 

Contents
  1. 簡単なルーティングをする方法
  2. Flaskで値を渡す動的なルーティングと渡す値の種類
  3. 複数の値を渡す動的なルーティング
  4. HTTPメソッド(GET,POST,PUT)に応じたルーティングの方法
  5. 複数のURLに対して同一の関数を対応させるルーティング

簡単なルーティングをする方法

ルーティングというのは、URLに応じて、実行されるページを変える機能のことを言う。
例えば、

  • http://〇〇〇.〇〇〇/item_list => 商品の一覧画面を表示する
  • http://〇〇〇.〇〇〇/item_detail => 商品の詳細画面を表示する

のように、Flaskで実行する処理に応じて、表示される画面を変えたい場合に、ルーティング機能は用いられる。

ルーティングをするには、Flask(__name__)で作成されたインスタンスを用いて、定義した関数にデコレーション

@app.route()
をつけることで実現することができる。

ルーティング機能の説明

 
以下に、ルーティングの設定をした例を記述する。
Flaskのアプリケーションの立ち上げ方法は、こちら(Windows, Mac)のページを参考にされたい

Example

  • ルーティングの設定(app.py)
from flask import Flask

app = Flask(__name__)

@app.route('/item-list') # http://○○○/item-listを実行した場合にこの関数が実行される
def func1():
    return '<h1>商品一覧ページです</h1>'
@app.route('/item-detail') # http://○○○/item-detailを実行した場合にこの関数が実行される
def func2():
    return '<h1>商品詳細ページです</h1>'
@app.route('/item-delete') # http://○○○/item-deleteを実行した場合にこの関数が実行される
def func3():
    return '<h1>商品削除ページです</h1>'

if __name__ == '__main__':
    app.run()

 
次に、app.pyを実行してアプリケーションを立ち上げ、各ページを表示した。
ここでは、ローカル環境で実行しているため、ホスト名は127.0.0.1でアクセスしている。
ポート番号はFlaskのデフォルトの5000である。

  • http://127.0.0.1:5000/item-list表示結果

  • http://127.0.0.1:5000/item-detail表示結果

  • http://127.0.0.1:5000/item-delete表示結果

Flaskで値を渡す動的なルーティングと渡す値の種類

では次に動的なルーティングについて説明したい。動的なルーティングとは、URLに変数を持たして、その変数に応じて表示されるページを変えるルーティング方法のことを言う。
例えば

  • http://○○○.○○○.○○○/sample/1 → 画面上に1と表示する
  • http://○○○.○○○.○○○/sample/1 → 画面上に2と表示する

などが例として挙げられる。

 

これを行うには、ルーティングの際に/<var>のように<>で囲まれた変数を記載し、
関数の引数にも、def func(var):と言うふうにvarを引数として取るようにして記述をする。

また、動的に値を送信する際に、その送信する値の型(整数、小数点、文字列)なども指定することができる。

・Flaskで送信できる値の型

型 意味
string デフォルト。スラッシュを除く文字列
int 正の整数
float 浮動小数点数
uuid UUIDフォーマットの文字列。xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxのフォーマットで一意に識別する
path URLのパス。/を含んだ文字列

Example

では、実際に例を見ながら、動的なルーティングを確認しよう。

@app.route('/item-detail/<int:id>') # http://○○○/item-detail/idを実行した場合にこの関数が実行される
def func(id):
    return '<h1>id={}商品詳細ページです</h1>'.format(id)

if __name__ == '__main__':
    app.run()

 
次に、app.pyを実行してアプリケーションを立ち上げ、ページを表示する。
ここでは、ローカル環境で実行しているため、ホスト名は127.0.0.1でアクセスしている。
ポート番号はFlaskのデフォルトの5000である。

  • http://127.0.0.1:5000/item-detail/12の表示結果

ここで、idはint型のため(<int>としているため)、関数の中で整数として扱い、計算をすることもできる。

  • 計算をしてその結果を表示する
@app.route('/item-detail/<int:id>') # http://○○○/item-detail/idを実行した場合にこの関数が実行される
def func(id):
    id += 10
    return '<h1>id={}商品詳細ページです</h1>'.format(id)

 
この場合idに10足されて以下のように表示される。

ちなみに、stringを指定して、計算しようとするとエラーになるので、注意が必要である。

  • stringに対して+10をしてエラーとなった例
@app.route('/item-detail/<string:id>') # http://○○○/item-detail/idを実行した場合にこの関数が実行される
def func(id):
    id += 10 # TypeError: can only concatenate str (not "int") to str
    return '<h1>id={}商品詳細ページです</h1>'.format(id)

 
他にも、pathを指定した場合とuuidを指定した場合も見ておきたい。

pathとは要するに、/(スラッシュ)を含んだ文字列のことで、uuidとは重複のないIDのことで、XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXで表される。

  • pathを用いた動的ルーティングの例
@app.route('/item-detail/<path:path>')
def func(path):
    return 'path = {}'.format(path)

 

  • uuidを用いた動的ルーティングの例
@app.route('/item-detail/<uuid:uuid>')
def func(uuid):
    type(uuid) #class 'uuid.UUID'
    return 'uuid = {}'.format(uuid)

 

 

以上、動的なルーティングについて説明した。

複数の値を渡す動的なルーティング

動的なルーティングで複数の値をわたすこともできる。
この場合は、routeを<〇〇>/<××>として、
関数を、def func(〇〇, ××):
と複数設定すればよい。

この場合、pathを最後の変数以外に設定することはできない。

Example

では、複数の値に対する動的なルーティングを見ていこう

@app.route('/<msg1>/<msg2>') # http://○○○/item-detail/msg1/msg2を実行した場合にこの関数が実行される
def func(msg1, msg2):
    type(msg1) # str
    type(msg2) # str
    return 'msg1 = {}, msg2 = {}'.format(msg1, msg2)

 
これを画面で表示する。

  • http://127.0.0.1:5000/hello/goodbyeの表示結果

HTTPメソッド(GET,POST,PUT)に応じたルーティングの方法

HTTPメソッドにはGET, POST, PUTなど様々なものがあるが、FlaskのルーティングではデフォルトでGETに対してルーティングを行う。
では、GET以外に対してルーティングを行いたい場合どのように記載するとよいのか

@app.route("/example", methods=["METHOD_A", "METHOD_B"]) # GET POST PUT PATCH DELETE など

と記載すればよい。

それぞれ、見ていきたい

Example

  • GETとPOSTメソッドを許可する
@app.route("/log-in", methods=["GET", "POST"])
def log_in():

    if request.method == "POST":
pass # HTTPメソッドがPOSTだった場合に実行したい処理を記載する
    elif request.method == "GET":
        pass# GETの場合の処理を記載

 

  • PUTリクエストを扱う例
@app.route("/stock/", methods=["PUT"])
def put_collection(collection):
    pass PUTの処理を記述

複数のURLに対して同一の関数を対応させるルーティング

最後に複数のルーティングを行う方法について記述する。
と言っても、@app.routeを複数記述すればよいだけなので、いたって単純である。

Example

  • 複数のルーティングを設定
@app.route("/sample1")# sample1でこの関数を実行
@app.route("/sample2")# sample2でこの関数を実行
@app.route("/sample3")# sample3でこの関数を実行
def put_collection():
    pass

このようにすると、/sample1, /sample2, /sample3のいずれのURLで遷移しても、同じ関数が実行されて同じ画面を表示することができる。

以上、FlaskでのURLマッピング(ルーティング)の方法について記述しました。


Next »

テンプレートを利用する方法


Flask入門記事一覧はこちら

Filed Under: Flask Tagged With: flask, python, ルーティング

Primary Sidebar

注目記事

プロのエンジニアが選ぶPython入門者、初心者向けの書籍10選
元SEが語る、システムエンジニア(SE)ってどんな仕事?きつくてつらいのか?
元SEが語る、システムエンジニアの良いところ

スポンサーリンク