ルーティングとビュー

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ファイルに任せるという、役割の分離(関心の分離)を意識した設計が実務では極めて重要です。