Flask入門|ルーティングを理解しよう【チャプター1-04】

一つ前のページでは初めてのFlaskコードを書いてみました。
今回は ルーティング について見ていきましょう。
Chapter1:Flask入門編
・Chapter1-1:Flaskとは何か
・Chapter1-2:Flaskの開発環境を構築しよう
・Chapter1-3:初めてのFlaskコードを書いてみよう
・Chapter1-4:ルーティングを理解しよう ◁今回はここ
・Chapter1-5:動的ルーティングを理解しよう
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:Flaskの便利機能編
Chapter7:アプリ開発編
Webアプリケーションでは、ユーザーがブラウザで特定のURLにアクセスすると、それに応じたページが表示されます。
この仕組みの裏側には「ルーティング(Routing)」というとても重要な考え方が存在しています。
Flaskでは非常にシンプルなコードでルーティングを実現することができ、アプリ開発の第一歩となります。
h2: Flaskにおける「ルーティング」とは何か?初心者向けに基本をやさしく解説
「ルーティング」とは、一言で言うとURLと処理(関数)を紐づける仕組みのことです。
たとえば、あるユーザーが http://example.com/
にアクセスしたときに、「トップページを表示する関数」を実行したいとします。
逆に、http://example.com/about
というURLでは、「会社情報ページを表示する関数」を動かしたいというように、どのURLにアクセスされたら、どの処理を行うかを決める役目を持っているのがルーティングです。
Flaskでは、このルーティングをとても簡潔な形で記述することができます。
Flaskルーティングの基本構文と「app」の役割を丁寧に解説
Flaskでルーティングを行う際は、以下のように記述します。
@app.route("/URL部分") # もしこのURLにアクセスされたら def 関数名(): # この関数を実行する return "表示させたい内容"
このうち、@app.route()
の部分がルーティングを定義するための デコレータ です。"/"
や "/about"
のようなURLに対応する処理を、その下の関数で書いていきます。
ここで使われている app
は、Flaskのアプリケーション本体を表す インスタンス変数 です。これは次のようにしてインスタンス生成されます。
app = Flask(__name__) # 引数__name__を使ってFlaskクラスをインスタンス生成し、変数appに代入
この app
という名前自体は自由に変えても良いのですが、Flaskのチュートリアルや実務でも慣例的に app
という名前がよく使われています。
初心者のうちはこの慣習に従っておくと安心です。
実例で学ぶFlaskルーティング|初心者が迷わず理解できる2つの例
ルーティングの使用例を見ていきましょう。
「Hello Flask!」を表示する最短ルート構成を解説
ここでは、Chapter1-3で紹介したのとまったく同じコードを、ルーティングの部分に注目して解説します。
from flask import Flask # flaskモジュールの中のFlaskクラスをインポート # -- インスタンス生成 -- app = Flask(__name__) # Flaskクラスを使ってアプリのインスタンスを作成。引数には__name__を指定 # -- ルーティング -- @app.route("/") # ルートURL(http://〜/)にアクセスがあった時の処理を定義 def hello_flask(): # 関数hello_flaskを定義 return '<h1>HelloFlask!</h1>' # ブラウザに表示するHTML文字列を返す # -- サーバー起動 -- if __name__ == "__main__": # このファイルが直接実行されたときだけ、以下の処理を行う app.run(debug=True) # Flaskアプリを起動。debug=Trueをつけることでエラー時に詳細表示される
ルーティングの部分(7~9行目)に注目しましょう。
ここでは「/
にアクセスされたら hello_flask()
という関数を実行し、その結果をブラウザに表示する」という処理を行っています。
@app.route("/")
:アクセスされるURL(ここではトップページ)を指定def hello_flask():
:呼び出される関数を定義return '<h1>HelloFlask!</h1>'
:HTML文字列を返してページに表示
このように、URLと処理をとても直感的に結びつけることができるのがFlaskの魅力です。
発展:1つのアプリで複数のルートを持たせる具体例
ルーティングは一つのURLだけでなく、複数のURLに対応させることもできます。
@app.route("/about") def about(): return "<p>このページは About ページです</p>"
このようにすれば、http://〜/about
にアクセスしたときにこの about()
関数が実行され、<p>〜</p>
のHTMLが表示されます。
まとめ:Flaskルーティングで必ず押さえておきたい要点
- ルーティングとは、URLと関数を結びつける仕組みです。
- Flaskでは
@app.route("URL")
という簡潔な記述で定義できます。 app
はアプリのインスタンスで、慣習的にこの名前がよく使われます。- 一つのアプリに複数のルートを持たせることもできます。
次の章では「URLの一部を変数のように扱う方法(動的ルーティング)」について学びます。お楽しみに!
練習問題:Flaskルーティングを使った実践課題で理解を深めよう
今回は、Flaskにおける「ルーティング」の基本的な使い方を学ぶための練習問題です。
2つの異なるURLにアクセスしたときに、それぞれ異なる日本語のメッセージをブラウザ表示する簡単なWebアプリを作成してみましょう。
この問題の要件
以下の要件に従ってコードを完成させてください。
- Flaskをインポートし、インスタンスを作成すること
@app.route("/")
を使ってトップページのルートを定義すること- トップページにアクセスされたときに「これはトップページです」というメッセージを表示すること
@app.route("/greeting")
を使って別のルート/greeting
を定義すること/greeting
にアクセスされたときに「こんにちは!Flaskへようこそ!」というメッセージを表示すること
ただし、以下のような実行結果となるコードを書くこと。
このコードを実行し、URL「http://localhost:5000/」にアクセスしたとき:
これはトップページです
URL「http://localhost:5000/greeting」にアクセスしたとき:
こんにちは!Flaskへようこそ!
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント:コードの構成を見る
-
正解のコードは上から順に以下のような構成となっています。
1:Flaskライブラリから必要なクラス(Flask)をインポート
2:Flaskアプリ本体となるインスタンスを作成(Flask(__name__)
)
3:「トップページ(/)」にアクセスされたときに表示する内容を定義
4:「/greeting」ページにアクセスされたときに表示する内容を定義
5:このPythonファイルを直接実行したときにだけ、Flaskアプリが起動するように設定(if __name__ == "__main__"
を使う)
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
正解コード
例えば、以下のようなプログラムが考えられます。
- 正解コード
-
from flask import Flask # Flaskクラスをflaskモジュールからインポート # Flaskアプリケーションのインスタンスを作成 # __name__ は現在のファイル名を表し、Flaskが実行環境を判断するために使います app = Flask(__name__) # ---------------------- # ルーティングの定義(今回の学習ポイント) # ---------------------- # "/" にアクセスがあった場合に実行される関数 @app.route("/") # この関数はトップページにアクセスされたときに実行されます def home(): # 日本語で文字列を返します(ブラウザに表示されます) return "これはトップページです" # "/greeting" にアクセスがあった場合に実行される関数 @app.route("/greeting") # greetingページ用のルート(ルート=道の意味) def greet(): return "こんにちは!Flaskへようこそ!" # ---------------------- # アプリケーションの起動設定 # ---------------------- # このファイルが直接実行された場合のみ、以下の処理を行う if __name__ == "__main__": # Flaskの開発用サーバーを起動します # debug=True を指定すると、エラーが起きたときに詳細な情報が表示されます app.run(debug=True)
正解コードの詳細解説
正解コードをブロックごとに分割して解説します。
- 正解コードの詳細解説
-
1:Flaskライブラリのインポート
from flask import Flask
FlaskというWebアプリケーション用のライブラリから、Flaskというクラスを使えるように読み込んでいます。
このクラスを使って、これからFlaskアプリの“本体”を作っていきます。
2:アプリケーションインスタンスの作成
app = Flask(__name__)
Flaskアプリケーションのインスタンス(実体)を作成しています。
__name__
は「このファイルが実行されているときの名前」を表す特別な変数です。Flaskではこれを使ってアプリを正しく動作させる準備をしています。作成したインスタンスは
app
という名前で使えるようにしています。3:トップページ用のルート定義
@app.route("/") def home(): return "これはトップページです"
@app.route("/")
は、「ユーザーがWebブラウザで/
にアクセスしてきたときに、この下にある関数を実行してください」という意味の設定です。ここでは
home()
という関数が定義されており、実行されると「これはトップページです」という文字列が表示されるようになっています。
※この文字列が実際にブラウザに表示されます。4:「/greeting」用のルート定義
@app.route("/greeting") def greet(): return "こんにちは!Flaskへようこそ!"
このブロックは、
/greeting
というURLにアクセスがあった場合の処理を定義しています。greet()
という関数が呼ばれ、「こんにちは!Flaskへようこそ!」というメッセージをブラウザに返します。5:アプリケーションの起動設定
if __name__ == "__main__": app.run(debug=True)
この部分は「このファイルが直接実行されたときだけ、Flaskアプリを起動する」ための仕組みです。
app.run()
でアプリを起動し、debug=True
を指定すると、コードにエラーがあった場合に詳細なエラーメッセージを表示してくれる便利なモードになります。
FAQ|Flaskルーティングの基礎でつまずきやすいポイント
- Q1. Flaskでルートを定義したのにページが表示されないのはなぜですか?
-
多くの場合、Flaskアプリが正しく起動していなかったり、定義したルートに対応するURLが間違っているケースが原因です。まずは
@app.route()
の引数とブラウザでアクセスしているURLが一致しているか確認しましょう。
- Q2.
@app.route()
の中にスラッシュを入れるかどうかで違いはありますか? -
あります。例えば
@app.route('/about')
と@app.route('/about/')
はFlaskでは別ルートとして扱われます。末尾のスラッシュがあるとリダイレクトされる場合があるため、意図に合わせて使い分けましょう。
- Q3. ルートの中で変数を使いたいときはどうすればいいですか?
-
ルートに変数を埋め込みたい場合は、
<変数名>
の形式で指定します。たとえば@app.route('/user/<username>')
のように書くと、URLの一部を変数として関数に渡すことができます(詳細は次章で解説予定)。
質問用コンタクトフォーム
この記事を書くにあたりAIを活用しています。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。