プロへの道 » バックエンドコース » ユニット4

バックエンドコース ユニット4 | 目安: 160時間 (約2ヶ月)

WebアプリとAPI ― Flaskでサーバーを立てる

ここまでに作った道具は、自分のパソコンの中で完結していました。このユニットでは、Pythonの定番ライブラリFlask (フラスク) でWebサーバーを立て、ブラウザから使えるアプリに進化させます。CSV・SQL・例外処理 ― これまでの全部が、ここで合流します。

このユニットのゴール フォームから受け取り、データベースに保存し、一覧で表示する ― 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往復です。ブラウザが「これください」(リクエスト)、サーバーが「どうぞ」(レスポンス)。これから自分が作るのは、この「どうぞ」を返す側です。

例題 (リードつき) | 開発者ツールで観察する
  1. Networkタブを開くブラウザで F12 → 「Network」タブ → ページを再読み込みします。1行 = 1往復の一覧が流れます。
  2. ステータスコードを覚えるStatus列の数字が返事の種類です。200 = 成功 / 404 = 見つからない / 500 = サーバー側の故障。まずこの3つで足ります。
  3. 404を見るURLの末尾に /nai-page をつけて開き、404を観察します。
  4. 観察メモ「リクエスト = 」「レスポンス = 」「404 = 」を自分の言葉で3行にまとめます。来週から、この返事を自分で書きます。

授業2: Flask入門 ― 最初のサーバーを立てる

例題 (リードつき) | 30分で自分のサーバー
  1. Flaskを取り寄せるターミナルで pip install flask を実行します。
  2. app.pyを書く
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def home():
        return "こんにちは、私のサーバーです!"
    
    if __name__ == "__main__":
        app.run(debug=True)
    @app.route("/") は「このURLに来たら、下の関数で返事する」という割り当てです。
  3. 起動するpython app.py。ターミナルに http://127.0.0.1:5000 と出たら、それをブラウザで開きます。挨拶が表示されたら ― あなたのパソコンは、いまサーバーです。
  4. 窓口を増やす
    @app.route("/omikuji")
    def omikuji():
        import random
        return random.choice(["大吉", "中吉", "小吉", "凶"])
    /omikuji を開くたびに運勢が変わります。Step 3のおみくじが、Webサービスになりました。
  5. 止め方と直し方止めるのは Ctrl + Cdebug=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の値を埋め込んで返せます。

例題 (リードつき) | 商品一覧ページを作る
  1. テンプレートを置くtemplates フォルダを作り、index.html を入れます。
    <h1>{{ title }}</h1>
    <ul>
      {% for item in items %}
      <li>{{ item["name"] }} ― {{ item["price"] }}円</li>
      {% endfor %}
    </ul>
    {{ }} が値の差し込み口、{% for %} が繰り返しです。
  2. 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)
  3. データベースとつなぐitemsを手書きのリストから、ユニット3の pan.db をSELECTした結果に差しかえます。データベース → Python → テンプレート → ブラウザ。この一本の流れが、世の中のWebアプリの背骨そのものです。

授業4: フォームと保存 ― 基本循環を完成させる

読む (GET) の次は、受け取って保存する (POST) です。これで「書く → 保存 → 一覧」というWebアプリの基本循環が完成します。題材はこの先ずっと使う日報アプリです。

例題 (リードつき) | 日報を書き込めるようにする
  1. テーブルを設計するユニット3の流儀で、まず紙に書きます。今回は1テーブルで十分です。
    nippo: id, day, name, content
  2. フォームを置くテンプレートに追加します。
    <form action="/add" method="post">
      <input name="name" placeholder="名前">
      <textarea name="content" placeholder="今日やったこと"></textarea>
      <button>記録する</button>
    </form>
  3. 受け取って保存する
    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("/") は「保存したら一覧に戻す」の定番です。
  4. 一覧に出すトップの関数で SELECT * FROM nippo ORDER BY id DESC した結果をテンプレートに渡し、新しい順に表示します。
  5. 循環を確かめる書く → 戻る → 一覧に増えている → サーバーを再起動しても残っている。ここまで動けば、基本循環の完成です。
守りも忘れずに: 空の日報を弾く (if not request.form["content"]: なら保存せず戻す) ― ユニット2で学んだ「転ばない道具」の心は、Webでも同じです。

授業5: JSON API ― 機械向けの窓口

人間向けのページ (HTML) のほかに、プログラム向けの窓口 (JSON) も作れると、あなたのアプリは他のプログラムと会話できるようになります。ユニット5 (画面づくり) で、この窓口が主役になります。

例題 (リードつき) | 日報APIを生やす
  1. 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
        ])
  2. ブラウザで見るhttp://127.0.0.1:5000/api/nippo を開くと、日報がJSONで返ります。郵便番号APIで見たのと同じ景色を、自分が提供しています。
  3. 件数の窓口も足す/api/count = 日報の合計件数を {"count": 12} の形で返す窓口を、自分で書いてみます (SELECT COUNT(*) の出番です)。

ユニット制作: 日報Webアプリを完成させる

ユニット制作

授業4の原型を、「事業所で本当に使えそう」と言える水準に仕上げます。

  1. 機能をそろえる: ①書く ②新しい順の一覧 ③日付で絞り込み (例: /day/2026-06-13) ④名前で絞り込み ⑤JSON API、の5点です。③④は授業2の「URLで受け取る」とWHEREの合体で作れます。
  2. 見た目の最低限: テンプレートにCSSを少し足し、読みやすい一覧にします (本格的な画面づくりはユニット5のお楽しみです)。
  3. 検査: 空入力・とても長い入力・存在しない日付のURL、の3つの意地悪に耐えるか確かめます。
  4. デモ発表: スタッフに実際に日報を書いてもらい、データベース (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) でどう書くか見比べてみましょう。言語が違っても骨格は同じです。

できたチェック