ルーティングとビュー | Flaskの基本 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

ルーティングとビュー

PythonでWebアプリケーションを構築する際、世界中で広く使われている軽量フレームワークがFlask(フラスク)です。Flaskは必要最小限の機能に絞って設計されており、直感的にWebサーバーの仕組みを学ぶことができます。

Webアプリ開発の土台となるのが、「ルーティング」「ビュー」という2つのコア概念です。ユーザーがブラウザのURL欄に入力したアドレス(リクエスト)に対して、サーバー側がどのプログラムを動かし、どんな画面(レスポンス)を返すのかを決定する、Webアプリの交通整理の仕組みを詳しく解説します。

ルーティングとビューの本質

この2つの概念は、常にセットで動作します。

  • ルーティング(Routing): 「URLのパス」と「実行するPythonの関数」を紐付ける仕組みです。Flaskでは、関数を修飾する @app.route() というデコレーターを使って直感的に指定します。
  • ビュー(View / ビュー関数): ルーティングによって呼び出される、実際の処理が書かれた関数です。最終的にブラウザへ表示させるHTML文字列やデータ(戻り値)を返却(リターン)する役割を持ちます。
from flask import Flask

# Flaskアプリケーションのインスタンスを生成
app = Flask(__name__)

# 1. ルーティングの設定:トップページ('/')にアクセスがあった場合
@app.route('/')
def index():
    # 2. ビュー関数の処理:ブラウザに返すメッセージをリターンする
    return 'Hello, Flask!'

if __name__ == '__main__':
    # デバッグモードを有効にして開発サーバーを起動
    app.run(debug=True)

複数のルートとHTTPメソッドの指定

実際のWebサイトでは、「会社概要ページ」や「問い合わせフォームの送信」など、複数の異なるURLパスや、データの送信形式(HTTPメソッド)を制御する必要があります。

Flaskでは、同一のURLパスであっても、画面を表示するときの GET メソッドと、フォームからデータを送信するときの POST メソッドで処理を条件分岐させることが可能です。

from flask import Flask, request

app = Flask(__name__)

# パターン1: 単純な複数ページのルーティング
@app.route('/about')
def about():
    return 'ここは「会社概要」のページです。'

# パターン2: HTTPメソッド(GET/POST)による処理の使い分け
@app.route('/submit', methods=['GET', 'POST'])
def submit():
    # request.method をチェックして、アクセス方法を判別します
    if request.method == 'POST':
        # フォームの「送信」ボタンが押されたときの処理
        return 'フォームからデータがPOST方式で正常に送信されました。'
    else:
        # 普通にブラウザでページを開いたときの処理
        return 'データを入力するためのGET画面を表示しています。'

動的なURLパス(変数コンバーター)の活用

「`/user/john`」や「`/user/alice`」のように、アクセスするユーザーや商品ごとにURLが変化するシステムを、ページ数分だけ手動でルーティング定義するのは現実的ではありません。

Flaskでは、URLパスの一部を <変数名> で囲むことで、変化する文字列を動的にキャッチし、そのままビュー関数の引数として中に引き渡すことができます。これを変数コンバーターと呼びます。

from flask import Flask

app = Flask(__name__)

# 1. 基本的な動的ルーティング(文字列として受け取る)
@app.route('/user/')
def show_user_profile(username):
    # URLから抽出した username を、f文字列(フォーマット済み文字列)で画面に埋め込む
    return f'ターゲットユーザー: {username}'

# 2. 実務テクニック:型指定コンバーター
# <型:変数名> と書くことで、指定した型以外のアクセスを自動で弾く(404エラーにする)ことができます
@app.route('/post/')
def show_post(post_id):
    # post_id は自動的に「整数型(int)」としてビュー関数に渡されます
    return f'記事ID【 {post_id} 】の詳細ページを表示しています。'

実務のベストプラクティス:HTMLテンプレートの返却(render_template)

ここまでの例では、ビュー関数から直接 'Hello, Flask!' といった単純な文字列を返していましたが、実際のプロダクト開発でデザインされたWebページを表示させるには、HTMLファイルを読み込んで返す必要があります。

Flaskでは、プログラムと同じ階層に templates フォルダ を作成し、その中に格納したHTMLファイルを render_template 関数 で呼び出すのが標準的な設計パターンです。

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/welcome/')
def welcome(name):
    # templates/welcome.html を読み込み、変数 name のデータをHTML側へ引き渡して動的にレンダリングします
    return render_template('welcome.html', user_name=name)

まとめ

  • デコレーターによる美しい紐付け: @app.route() を使うことで、どのURLにアクセスがあったときにどのPython関数を動かすべきかが、コード上で一目で把握できるリーダブルな設計になっています。
  • 動的URLと型制約によるガード: <int:post_id> などのコンバーター機能を活用すれば、文字列が紛れ込むことによるバグや不正アクセスをルーティングの段階で安全にシャットアウトできます。
  • 役割の明確な分離: ビュー関数は「ロジックの処理」と「レスポンスの返却」に集中させ、実際の画面デザインは render_template を使って外部のHTMLファイルに任せるという、役割の分離(関心の分離)を意識した設計が実務では極めて重要です。