Flask入門 Day 1:ゼロから学ぶWebフレームワークの基礎

Flask入門 Day 1:ゼロから学ぶWebフレームワークの基礎

こんにちは!今日から、PythonのWebフレームワークであるFlaskをゼロから学んでいこうと思います。

これまでFlaskに触れる中で、「デコレーターって何?」「ルーティングってどうやるの?」といった疑問がたくさん出てきました。
そこで、自分で試しながら学習を進め、その記録をブログ記事として残していくことにしました。

もし、これからFlaskを学習しようと考えている方がいらっしゃれば、一緒に学んでいけたら嬉しいです!

1. そもそもFlaskって何?

まずは、「Flaskって一体何者なの?」というところから始めましょう。
私自身もまだ完全に理解しているわけではないので、ここは頼れるAI (Gemini) に解説をお願いしました。

私: Flaskって、簡単に言うと何?

Gemini:

Flask (フラスク) は、Pythonというプログラミング言語を使ってWebサイトやWebアプリケーションを作るための「骨組み」のようなものです。Webフレームワークと呼ばれます。

Flaskの主な特徴:

  • シンプルで小さい (マイクロフレームワーク): Flaskは、Webアプリケーションを作る上で本当に最低限必要な機能だけを提供しています。そのため、構造が非常にシンプルで、初心者でも理解しやすいのが特徴です。「マイクロ」と呼ばれますが、小さいから機能が劣るという意味ではありません。
  • 学習しやすい: シンプルなので、基本的なWebの仕組みを理解しながら、比較的短時間でWebアプリケーションを作り始めることができます。
  • 自由度・拡張性が高い: 最初は最小限の機能しかありませんが、「拡張機能」と呼ばれる部品を追加していくことで、データベース接続、ユーザー認証、フォーム処理など、様々な機能を持った本格的なWebアプリケーションを開発できます。自分で必要なものを選んで組み合わせられる自由度の高さが魅力です。
  • 小〜中規模向き: シンプルさゆえに、個人開発や比較的小規模なWebサイト、API(プログラム同士が情報をやり取りする仕組み)の開発によく使われます。もちろん、工夫次第で大規模な開発にも対応できます。

簡単に言うと…
料理に例えると、Flaskは「シンプルなキッチン」のようなものです。基本的なコンロと流し台だけが用意されていて、あとは自分で好きな調理器具(オーブン、ミキサーなど=拡張機能)を持ち込んで、好きな料理(Webアプリケーション)を作ることができます。最初から全ての機能が揃っている豪華なキッチン(他の多機能なフレームワーク、例えばDjangoなど)とは対照的です。

まとめ:
Flaskは、PythonでWeb開発を始めたい初心者にとって、シンプルで学びやすく、自由度が高いおすすめのツールです。まずは簡単なWebページを表示させるところから始めて、少しずつ機能を拡張していくことができます。

なるほど!「シンプルなキッチン」という例え、とても分かりやすいですね。
私もPythonを使ったWebアプリケーション開発は経験が浅いので、「学習しやすい」「シンプルで小さい」という特徴は魅力的です。
まずはFlaskで基礎を固めて、いずれはDjangoのような大規模フレームワークにも挑戦できたら良いなと思います。

2. プロジェクトのディレクトリ構造を考える

Flaskの学習を始めるにあたり、プロジェクトのディレクトリ構造をどうするか考えました。
最初は最小限の構成で始めて、後から整理する…というのもアリですが、今回は「大は小を兼ねる」の精神で、最初から中規模〜大規模プロジェクトにも対応できるような構造を採用することにしました。

ここでもGemini先生に相談!

私: Flaskを使った中規模〜大規模プロジェクトに適したディレクトリ構造を教えて!

Gemini:

アプリケーションが少し大きくなってきた場合、ファイルを機能ごとに分割し、パッケージとしてまとめる方法が一般的です。こちらの方が管理しやすく、拡張性も高まります。


myproject/
│
├── run.py           # アプリケーションを起動するためのスクリプト
├── config.py        # 設定ファイル (秘密鍵、データベース接続情報など)
├── requirements.txt # プロジェクトで使うPythonライブラリ一覧
├── instance/        # (オプション) Git管理外にしたい設定ファイルなど
│   └── config.py
│
├── app/             # アプリケーション本体 (Pythonパッケージ)
│   │
│   ├── __init__.py    # appディレクトリをパッケージ化し、Flaskインスタンスを作成(Factoryパターン)
│   │
│   ├── routes.py      # ルーティング定義 (または views.py)
│   ├── models.py      # (もしあれば) データベースモデル定義
│   ├── forms.py       # (もしあれば) フォーム定義 (WTFormsなど)
│   │
│   ├── templates/     # HTMLテンプレート
│   │   ├── index.html
│   │   ├── auth/
│   │   │   └── login.html
│   │   └── layout.html
│   │
│   └── static/        # 静的ファイル
│       ├── css/
│       │   └── style.css
│       ├── js/
│       │   └── script.js
│       └── img/
│
└── venv/            # (オプション) Python仮想環境ディレクトリ

各ファイル/ディレクトリの役割:

  • run.py: アプリケーションインスタンスをインポートし、開発サーバーを起動するスクリプト。
  • config.py: 秘密鍵、デバッグモード、データベースURIなどの設定を記述。
  • requirements.txt: プロジェクトに必要なライブラリ一覧。
  • app/: アプリケーションの主要なコードを格納。
    • __init__.py: `app` ディレクトリをPythonパッケージとして認識させ、Flaskアプリケーションインスタンスを作成する(Application Factoryパターン推奨)。
    • routes.py (または views.py): URLルーティング定義をまとめる。
    • models.py, forms.py: 必要に応じてデータベースモデルやフォーム定義を分割。
    • templates/: HTMLテンプレートファイル。
    • static/: CSS, JavaScript, 画像などの静的ファイル。

役割まで丁寧に説明してくれて、本当に助かります!
今回は、このディレクトリ構造を参考に、Flaskの学習を進めていきます。

3. Flaskアプリケーションの初期化と設定

Flaskを使うには、まずアプリケーションの初期化が必要です。

簡単に言うと、「Flaskアプリケーションの実体(インスタンス)を作ること」です。
run.py または app/__init__.py で、以下のように記述します。


from flask import Flask

app = Flask(__name__)
# 他の初期設定や拡張機能の登録など

この app = Flask(__name__) という行で、Flaskアプリケーションのインスタンスが作成され、変数 app に代入されます。
これにより、app を通してFlaskの様々な機能を利用できるようになります。

次に、アプリケーションの動作をカスタマイズするための設定を行います。
設定は、app.config という辞書のような属性に値を設定します。


# 例: run.py や config.py 内で
app.config['SECRET_KEY'] = 'your_secret_key' # セッション管理などに使う秘密鍵 (本番環境では複雑なものに)
app.config['DEBUG'] = True # デバッグモードを有効にする (開発時のみ True に)

今回は、開発中に便利なデバッグモードを有効にし、SECRET_KEYはとりあえず仮の値を設定しておきました。

4. ルーティングとデコレーター:Flaskの核心!

いよいよ、Flaskの核心とも言えるルーティングデコレーターについてです。
私も最初はこの辺りの概念がよく分からなかったので、Gemini先生に聞いてみました。

私: ルーティングって何?

Gemini:

Webアプリケーションにおけるルーティングとは、簡単に言うと**「特定のURL(ウェブアドレス)へのアクセスを、どの処理(Pythonの関数)に結びつけるか」というルールや仕組み**のことです。
イメージとしては、Webサイトの「交通整理係」や「案内係」のようなものです。

ユーザーがブラウザで特定のURL(例えば http://example.com/profile)にアクセスしたとき、Webサーバーはそのリクエストを受け取ります。ルーティングは、その /profile という道(URLパス)を見て、「この道に来たリクエストは、プロフィール情報を表示する処理(関数)に案内しよう」と判断し、実際にその処理を実行させる役割を担います。

なぜルーティングが必要か?
Webサイトには通常、複数のページや機能があります。それぞれのページや機能には、異なるURLが割り当てられています。ルーティングがないと、どのURLにアクセスされても、どの処理を実行すれば良いのかWebアプリケーションが判断できません。ルーティングによって、「このURLならこの処理を実行して、このHTMLを表示する」という対応付けを明確にすることで、ユーザーが意図した情報を正しく表示できるようになります。

Flaskでは、次に学習するデコレーター (@app.route('/url') のような記述) を使って、このURLと処理(関数)の結びつけ(=ルーティング)を非常に簡単に定義することができます。

私: じゃあ、デコレーターって何?

Gemini:

デコレーター (Decorator) とは、Pythonの機能の一つで、既存の関数に「飾り付け」をして、新しい機能を追加したり、挙動を変更したりするための仕組みです。
イメージとしては、プレゼントを包装紙で包んだり、リボンをかけたりするのに似ています。元のプレゼント(関数)はそのままに、外側に機能(包装やリボン)を追加する感じです。

デコレーターの主な役割:

  • 関数を「ラップ」する: デコレーターは、対象となる関数を受け取り、その関数の実行前後に特定の処理を追加したり、関数の挙動を少し変えたりした「新しい関数」を返します。
  • コードの再利用性を高める: 同じような「飾り付け」を複数の関数に適用したい場合に、デコレーターを使えばその処理を一度だけ書いて、あとは各関数に @ マークを使って簡単に適用できます。
  • コードをきれいに保つ: 元の関数のコード自体には手を加えずに追加機能を実現できるため、関数の本来の目的(主処理)と追加機能(飾り付け)を分離でき、コードが読みやすくなります。

Flaskにおけるデコレーター (@app.route()):
Flaskでルーティングを定義するときに見た @app.route('/') が、まさにデコレーターの典型的な使い方です。


from flask import Flask

app = Flask(__name__)

# ↓↓↓ これがデコレーターです ↓↓↓
@app.route('/')
# ↑↑↑ このデコレーターが、すぐ下の index 関数を「飾って」います ↑↑↑
def index():
    return '<h1>トップページ</h1>'

@app.route('/about')
def about():
    return '<h1>このサイトについて</h1>'

このコードでは:

  • @app.route('/') というデコレーターが、すぐ下にある index() 関数を対象としています。
  • このデコレーターは、index() 関数に**「ルートURL ( / ) へのアクセスがあったときに、この index 関数を実行するようにFlaskアプリケーション app に登録する」**という機能を追加(飾り付け)しています。
  • 同様に、@app.route('/about')about() 関数に「/about URLへのアクセスと実行を結びつける」機能を追加しています。

このように、Flaskではデコレーターを使うことで、「どのURLにアクセスされたら」「どの関数を実行するか」というルーティングの定義を、非常に直感的で簡潔な @app.route(...) という形で記述できるようになっています。

なるほど!@app.route() はPythonのデコレーター機能を使って、URLと関数を結びつけているんですね。
デコレーター自体はPythonの機能なので、もっと詳しく知りたければPythonの公式ドキュメントも参考になります。

参考: 用語集 — Python 3.13.3 ドキュメント

正直、デコレーターの仕組み自体はまだ完全に理解できていませんが、「そういうものか」という感じで、まずは使いながら慣れていこうと思います。

5. ひと段落

今回は、Flask学習の第一歩として、

  • Flaskの概要
  • プロジェクトのディレクトリ構造
  • アプリケーションの初期化と設定
  • ルーティングとデコレーターの基本的な考え方

について学びました。

まだ「よくわからないけど使ってみる」段階ですが、少しずつ理解を深めながら、実際にWebアプリケーションを作っていけるように頑張ります!

Comments

No comments yet. Why don’t you start the discussion?

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です