XBPx Portfolio · Japan
Contact
Lesson 03 / Flask

第三回
Flask入門

Python Flask Jinja2 CSV

CH 01Flask とは / インストール

Flask は Python で書ける軽量な Web アプリケーションフレームワーク。「URL に来たリクエストを関数で受け取り、HTML を返す」というシンプルな仕組みで、最初の一歩に向いている。

インストール

ターミナルで以下を実行するだけで導入できる。

pip install flask

今回扱う 3 つの要素

app.py

ルーティングと表示用データを書く Python 側のエントリーポイント。

templates/

HTML テンプレートを置くフォルダ。index.html をここに配置する。

static/

CSS や画像などの静的ファイル置き場。style.css はここから読み込む。

Point Flask の世界では「Python が値を作り、HTML がそれを表示する」という役割分担が基本。データの中身は app.py、見た目は templates/ に切り分けて考える。

CH 02基本構成と最小コード

まずは「/ にアクセスしたら index.html を返す」だけの最小構成を動かす。

app.py(最小)

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")

if __name__ == '__main__':
    app.run()

templates/index.html(最小)

<!DOCTYPE html>
<html lang="jp">
<head>
    <title>flaskテスト</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes">
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../static/css/style.css">
</head>
<body>
    <h1>テスト</h1>
    <div>
        てすとです。<br>
    </div>
</body>
</html>
How to run python app.py を実行すると http://127.0.0.1:5000/ でローカルサーバーが立ち上がる。ブラウザでそのアドレスを開くと、index.html がそのまま表示される。
Qiita 原文(Flask 基本)を読む

CH 03テンプレート文法(変数・for・if)

Flask のテンプレートは Jinja2。HTML の中に {{ ... }}{% ... %} を埋め込むことで、Python 側の値や制御構造をそのまま反映できる。

① 変数を HTML に渡す

app.py 側で render_template の引数として渡し、HTML 側では {{ 変数名 }} で受け取る。

# app.py
a = "こんにちは"
return render_template("index.html", txt=a)
<!-- index.html -->
<body>
    <h1>テスト</h1>
    <div>
        てすとです。<br>
        {{ txt }}<br>
    </div>
</body>

② for 文でくり返す

<h1>テスト</h1>
<div>
    {% for i in range(10) %}
        {{ txt }} --- {{ i }}<br>
    {% endfor %}
</div>

③ if 文で条件分岐

<h1>テスト</h1>
<div>
    {% for i in range(10) %}
        {% if i%2==0 %}
            {{ txt }} --偶数-- {{ i }}<br>
        {% else %}
            {{ txt }} --奇数-- {{ i }}<br>
        {% endif %}
    {% endfor %}
</div>

記法の使い分け

記法用途
{{ ... }}値を 表示 する{{ txt }}
{% ... %}制御構造(for / if)の開始・終了{% if x %}{% endif %}
{# ... #}テンプレート内コメント(出力されない){# memo #}
練習問題 2 つの変数 txt1 / txt2 を index.html に渡し、0〜9 の for 文で 偶数のときは txt1奇数のときは txt2 を表示する。

CH 04Python の復習

Step 2 では、テンプレートに渡すデータを Python 側で組み立てる。先にリスト操作と文字列置換を整理しておく。

リストの基本

  • 1 次元リストは list[i] で値を取り出す
  • 多次元リストは list[i][j] のように添字を重ねる
  • for 文と組み合わせて、行ごとの処理がそのまま書ける

文字列の置換

「ああああああああ」の に置き換える、というシンプルな例。

s = "ああああああああ"
s = s.replace("あ", "い")
print(s)  # いいいいいいいい
Point replace はチェーン(連続適用)できる。s.replace("(", "").replace(")", "") のようにつないで、まとめて記号を落とすことが多い。

CH 05CSV を読み込んで一覧表示

最終形は「CSV から読み込んだデータをリスト化し、テンプレート側で条件によって文字列 or リンクとして表示する」流れ。

app.py(CSV → リスト → テンプレートへ)

from flask import Flask, render_template, request, session, redirect, flash, url_for
from csv import reader

app = Flask(__name__)

@app.route('/')
def index():
    with open('./mmcsv.csv', 'r', encoding="utf-8") as csv_file:
        csv_reader = reader(csv_file)
        list_mm = list(csv_reader)

    for data in list_mm:
        data[3] = "https://www.google.com/maps?q=" + data[3] \
            .replace("(", "") \
            .replace(")", "") \
            .replace(" ", "")

    print(list_mm)
    return render_template("index.html", mmlist=list_mm)

if __name__ == '__main__':
    app.run()

index.html(最終形)

<h1>テスト</h1>
<div>
{% for data in mmlist %}
    {% if data[1]=="場所" %}
        {{ data[1] }} <br>
    {% else %}
        <a href={{ data[3] }} target="_blank">{{ data[1] }}</a><br>
    {% endif %}
{% endfor %}
</div>

処理の流れ

① 読み込み

open + csv.reader で CSV を 2 次元リストに変換。

② 整形

住所列の括弧と空白を replace で除去し、Google マップ URL を組み立てる。

③ 受け渡し

整形済みリストを mmlist としてテンプレートへ。

④ 表示分岐

ヘッダ行("場所")はそのまま、データ行はリンクとして描画。

学んだこと Flask の本質は「Python で作ったデータを、テンプレート側の表示ロジックでどう見せるか」を切り分けて書けること。CSV → リスト → Jinja2 まで通ると、外部データを使った Web ページの最小サイクルが一通り体験できる。
Qiita 原文(Flask step2)を読む