このユニットのゴール
フォームから受け取り、データベースに保存し、一覧で表示する ― Webアプリの基本循環を、Flaskで一人で組めるようになる。
進め方の地図
| 週 | やること | 仕上がるもの |
|---|---|---|
| 1週目 | 授業1: Webの仕組みを観察する | リクエストとレスポンスの観察メモ |
| 2週目 | 授業2: Flask入門 ― 最初のサーバー | 挨拶サーバー |
| 3週目 | 授業3: テンプレート ― HTMLに値を埋める | 商品一覧ページ |
| 4〜5週目 | 授業4: フォームと保存 ― 基本循環 | 書き込める日報の原型 |
| 6週目 | 授業5: JSON API ― 機械向けの窓口 | 日報API |
| 7〜8週目 | ユニット制作: 日報Webアプリ完成 | 事業所で使える日報アプリ |
授業1: Webの仕組み ― 1往復を見る
Webの会話は1往復です。ブラウザが「これください」(リクエスト)、サーバーが「どうぞ」(レスポンス)。これから自分が作るのは、この「どうぞ」を返す側です。
例題 (リードつき) | 開発者ツールで観察する
- Networkタブを開くブラウザで F12 → 「Network」タブ → ページを再読み込みします。1行 = 1往復の一覧が流れます。
- ステータスコードを覚えるStatus列の数字が返事の種類です。200 = 成功 / 404 = 見つからない / 500 = サーバー側の故障。まずこの3つで足ります。
- 404を見るURLの末尾に
/nai-pageをつけて開き、404を観察します。 - 観察メモ「リクエスト = 」「レスポンス = 」「404 = 」を自分の言葉で3行にまとめます。来週から、この返事を自分で書きます。
授業2: Flask入門 ― 最初のサーバーを立てる
例題 (リードつき) | 30分で自分のサーバー
- Flaskを取り寄せるターミナルで
pip install flaskを実行します。 - app.pyを書く
from flask import Flask app = Flask(__name__) @app.route("/") def home(): return "こんにちは、私のサーバーです!" if __name__ == "__main__": app.run(debug=True)@app.route("/")は「このURLに来たら、下の関数で返事する」という割り当てです。 - 起動する
python app.py。ターミナルにhttp://127.0.0.1:5000と出たら、それをブラウザで開きます。挨拶が表示されたら ― あなたのパソコンは、いまサーバーです。 - 窓口を増やす
@app.route("/omikuji") def omikuji(): import random return random.choice(["大吉", "中吉", "小吉", "凶"])/omikujiを開くたびに運勢が変わります。Step 3のおみくじが、Webサービスになりました。 - 止め方と直し方止めるのは Ctrl + C。
debug=Trueのおかげで、コードを保存すると自動で再起動されます。エラーもブラウザに詳しく表示されます (開発中だけの特権です)。
127.0.0.1とlocalhost: どちらも「自分のパソコン自身」を指す住所です。インターネットには出ていないので、安心して壊しながら学べます。
演習 2-A (ヒントだけ) | 窓口を3つ自作する
お題: ①/jikan = 今の日時を返す ②/saikoro = 1〜6の数を返す ③/aisatsu/yamada のように名前つきで呼ぶと「yamadaさん、こんにちは」と返す、の3窓口を足します。
③のヒント:
@app.route("/aisatsu/<name>") と書くと、関数が def aisatsu(name): の形でURLの一部を受け取れます。これがAPIの「パラメータ」の正体です。授業3: テンプレート ― HTMLに値を埋める
文字だけの返事から、ちゃんとしたHTMLのページへ。Flaskは templates フォルダのHTMLに、Pythonの値を埋め込んで返せます。
例題 (リードつき) | 商品一覧ページを作る
- テンプレートを置く
templatesフォルダを作り、index.htmlを入れます。<h1>{{ title }}</h1> <ul> {% for item in items %} <li>{{ item["name"] }} ― {{ item["price"] }}円</li> {% endfor %} </ul>{{ }}が値の差し込み口、{% for %}が繰り返しです。 - Pythonから渡す
from flask import Flask, render_template @app.route("/") def home(): items = [ {"name": "メロンパン", "price": 180}, {"name": "クロワッサン", "price": 220}, ] return render_template("index.html", title="パンの森", items=items) - データベースとつなぐitemsを手書きのリストから、ユニット3の
pan.dbをSELECTした結果に差しかえます。データベース → Python → テンプレート → ブラウザ。この一本の流れが、世の中のWebアプリの背骨そのものです。
授業4: フォームと保存 ― 基本循環を完成させる
読む (GET) の次は、受け取って保存する (POST) です。これで「書く → 保存 → 一覧」というWebアプリの基本循環が完成します。題材はこの先ずっと使う日報アプリです。
例題 (リードつき) | 日報を書き込めるようにする
- テーブルを設計するユニット3の流儀で、まず紙に書きます。今回は1テーブルで十分です。
nippo: id, day, name, content - フォームを置くテンプレートに追加します。
<form action="/add" method="post"> <input name="name" placeholder="名前"> <textarea name="content" placeholder="今日やったこと"></textarea> <button>記録する</button> </form> - 受け取って保存する
from flask import request, redirect import sqlite3 @app.route("/add", methods=["POST"]) def add(): con = sqlite3.connect("nippo.db") con.execute( "INSERT INTO nippo (day, name, content) VALUES (date('now'), ?, ?)", (request.form["name"], request.form["content"])) con.commit() con.close() return redirect("/")request.form["name"]がフォームの値の受け取り口、最後のredirect("/")は「保存したら一覧に戻す」の定番です。 - 一覧に出すトップの関数で
SELECT * FROM nippo ORDER BY id DESCした結果をテンプレートに渡し、新しい順に表示します。 - 循環を確かめる書く → 戻る → 一覧に増えている → サーバーを再起動しても残っている。ここまで動けば、基本循環の完成です。
守りも忘れずに: 空の日報を弾く (
if not request.form["content"]: なら保存せず戻す) ― ユニット2で学んだ「転ばない道具」の心は、Webでも同じです。授業5: JSON API ― 機械向けの窓口
人間向けのページ (HTML) のほかに、プログラム向けの窓口 (JSON) も作れると、あなたのアプリは他のプログラムと会話できるようになります。ユニット5 (画面づくり) で、この窓口が主役になります。
例題 (リードつき) | 日報APIを生やす
- jsonifyで返す
from flask import jsonify @app.route("/api/nippo") def api_nippo(): con = sqlite3.connect("nippo.db") rows = con.execute( "SELECT day, name, content FROM nippo ORDER BY id DESC").fetchall() con.close() return jsonify([ {"day": r[0], "name": r[1], "content": r[2]} for r in rows ]) - ブラウザで見る
http://127.0.0.1:5000/api/nippoを開くと、日報がJSONで返ります。郵便番号APIで見たのと同じ景色を、自分が提供しています。 - 件数の窓口も足す
/api/count= 日報の合計件数を{"count": 12}の形で返す窓口を、自分で書いてみます (SELECT COUNT(*) の出番です)。
ユニット制作: 日報Webアプリを完成させる
ユニット制作
授業4の原型を、「事業所で本当に使えそう」と言える水準に仕上げます。
- 機能をそろえる: ①書く ②新しい順の一覧 ③日付で絞り込み (例:
/day/2026-06-13) ④名前で絞り込み ⑤JSON API、の5点です。③④は授業2の「URLで受け取る」とWHEREの合体で作れます。 - 見た目の最低限: テンプレートにCSSを少し足し、読みやすい一覧にします (本格的な画面づくりはユニット5のお楽しみです)。
- 検査: 空入力・とても長い入力・存在しない日付のURL、の3つの意地悪に耐えるか確かめます。
- デモ発表: スタッフに実際に日報を書いてもらい、データベース (nippo.db) が育っていく様子と、APIの窓口まで見せて説明します。コードはGitHubへpushします。
公開についての大事な知識: このアプリはまだ自分のパソコンの中 (localhost) だけで動いています。インターネットへの公開には、サーバーを貸してくれるサービスと、ログイン機能などの安全対策が必要です。「動くこと」と「公開してよいこと」は別 ― これを知っているのも、バックエンドの実力のうちです。
つまずきやすいポイント
画面が500エラーになったら: あわてず、ターミナル (またはdebugモードのブラウザ表示) のTracebackを下から読みます。ユニット1の早見表が、そのまま武器になります。Webになっても、エラーの読み方は何も変わりません。
「直したのに変わらない」とき: ブラウザの再読み込み (Ctrl + R) を忘れているか、サーバーが止まっています。「コードを保存 → ターミナルで再起動を確認 → ブラウザを再読み込み」の3点を順に確かめましょう。
発展チャレンジ (余力のある方へ)
発展チャレンジ
- 日報に「気分 (5段階)」の列を足し、一覧に絵文字で表示してみましょう。テーブルの変更からテンプレートまで、縦に1本通す練習になります。
- 「Flask テンプレート 継承」を調べて、共通のヘッダーを1か所にまとめてみましょう (フロントコースの「ナビの正本」と同じ悩みを、Flaskはbase.htmlで解決します)。
- フロントエンドコースのユニット5 (pf-05) をのぞいて、同じAPIづくりをJavaScript (Express) でどう書くか見比べてみましょう。言語が違っても骨格は同じです。