新人エンジニアのFlask挑戦：Flask開発の基礎知識

# はじめに
Flaskは、Pythonで開発された軽量なWebフレームワークであり、シンプルでありながら非常に強力な機能を備えています。本記事では、Flaskを用いて基本的なWebアプリケーションを作成する方法を紹介します。

まず、Flaskの導入から始め、次にいくつかの基本的な機能の実装方法について説明します。最後に、実際にページを作成し、ブラウザ上で動作させる手順を示します。これにより、Flaskを使ったWeb開発の基礎を理解し、自分自身のプロジェクトに応用できるようになることを目指します。

# 実装(Ubuntu)
## 仮想環境の作成

https://qiita.com/shun_sakamoto/items/7944d0ac4d30edf91fde

pythonで独立した仮想環境を作製することで、異なるプロジェクトがお互いに影響を与えないようにします。
今回は、venvで仮想環境を作成します。
```
python3 -m venv flask
source flask/bin/activate
```

上記のコマンドで`flask`という名前の仮想環境を作製し、仮想環境をアクティベートします。

## 必要モジュールのインストール

flaskに必要なpythonモジュールをinstallします。
今回は、以下のモジュールをinstallしました。

```
blinker==1.8.2
click==8.1.7
Flask==3.0.3
Flask-SQLAlchemy==3.1.1
greenlet==3.0.3
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
numpy==2.0.0
packaging==24.1
pandas==2.2.2
plotly==5.22.0
psycopg2-binary==2.9.9
python-dateutil==2.9.0.post0
pytz==2024.1
six==1.16.0
SQLAlchemy==2.0.31
tenacity==8.5.0
typing_extensions==4.12.2
tzdata==2024.1
Werkzeug==3.0.3

```
install方法

1. requirements.txtを作製して、上記の内容をコピー&ペーストします
1. pip install -r requirements.txtで、仮想環境にバージョンを指定したモジュールをinstallできます

## フォルダ構成
```
./mysite
├── FirstView.py
├── __init__.py
├── __pycache__
│   ├── FirstView.cpython-310.pyc
│   ├── __init__.cpython-310.pyc
│   └── config.cpython-310.pyc
├── config.py
├── data
│   └── spotify_tracks.csv
├── dev_env
│   └── docker-compose.yml
├── models
│   ├── Spotify.py
│   └── __pycache__
│       └── Spotify.cpython-310.pyc
└── templates
    ├── ViewGraph.html
    └── ViewTable.html
```

## init.py
```
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('mysite.config')

db = SQLAlchemy(app)

from .models import Spotify

import mysite.FirstView

```
`__init__.py`のファイルでは、flaskの設定ファイルを読み込んで、DBへの接続情報を設定しています。

## config.py
設定ファイル
```
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'postgresql://myuser:mypassword@localhost:5432/mydatabase'
SQLALCHEMY_TRACK_MODIFICATIONS = False
```
DEBUGモードでの起動を設定。
SQLALCHEMY_DATABASE_URIでは、DBのURIを設定。今回は、dockerでpostrgresを立ち上げています。

## FirstView.py
djangoでいう、view.pyファイル
```
from flask import render_template
from mysite import app,db
from mysite.models.Spotify import Spotify\
import plotly.express as px

@app.route('/')
def table():
    table_data = Spotify.query.all()
    return render_template("ViewTable.html", table = table_data)

@app.route('/graph1')
def graphe1():
    # データを用意
    data = {
        'x': [1, 2, 3, 4, 5],
        'y': [10, 11, 12, 13, 14]
    }

    # Plotlyでグラフを作成
    fig = px.line(data, x='x', y='y', title='Sample Plot')
    
    # グラフをHTMLに変換
    graph = fig.to_html(full_html=False)
    return render_template("ViewGraph.html", graph = graph)

@app.route('/graph2')
def graphe2():
    test = Spotify.query.with_entities(Spotify.popularity).all()
    data = list(test)
    
    fig = px.histogram(data, title='Histogram Example')
    graph = fig.to_html(full_html=False)
    
    return render_template("ViewGraph.html", graph = graph)
```
今回は３ページのwebサイトを作成しています。
- グラフの表示
  - サンプルデータで、plotlyでデータをhtmlで表示
  - DBからデータを取得してヒストグラムで表示
- テーブル表示
    - DBを一覧で表示

@app.routeで、webサイトのURLを設定しています。
djangoと違って、viewファイルの中に直接設定します。

## templates
今回は２種類のテンプレートを作製しました。
templateフォルダ名は誤植などに気を付けてください。
グラフ表示用のhtml
```
<h1>sample Flask</h1>

<div>
    {{ graph|safe }}
</div>
```
テーブル表示用のhtml
```
<h1>DB Flask table</h1>

<body>
    <h1>table List</h1>
    <table border="1">
        <tr>
            <th>name</th>
            <th>album</th>
            <th>popularity</th>
            <th>duration_ms</th>
            <th>explicit</th>
        </tr>
        {% for t1 in table %}
        <tr>
            <td>{{ t1.name }}</td>
            <td>{{ t1.album }}</td>
            <td>{{ t1.popularity }}</td>
            <td>{{ t1.duration_ms }}</td>
            <td>{{ t1.explicit }}</td>
        </tr>
        {% endfor %}
    </table>
</body>
```
## model
テーブルの設定を行います。
Spotifyのデータを格納するテーブル`Spotify.py`を設定しています。

↓今回利用したデータです。

https://www.kaggle.com/datasets/ambaliyagati/spotify-dataset-for-playing-around-with-sql

```
from mysite import db

class Spotify(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    spotify_id = db.Column(db.String(220))
    name = db.Column(db.String(220))
    genre = db.Column(db.String(220))
    artists = db.Column(db.String(220))
    album = db.Column(db.String(220))
    popularity = db.Column(db.Integer)
    duration_ms = db.Column(db.Integer)
    explicit = db.Column(db.Boolean)
```
DBのテーブルはいかのコマンドで作成できます。
※DBの接続情報、ＤＢが立ち上がっていることが前提です。
```
% python
>>> from mysite import app
>>> from mysite import db
>>> with app.app_context():
...    db.create_all()
>>> exit()
```
インデントの調整はtabキーでそろえる

## server.py
serverファイルを設定します
```
from mysite import app

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

## dockerファイルの設定
docker-compose.yml
```
version: '3.8'

services:
  db:
    image: postgres:13
    container_name: my_postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydatabase
    ports:
      - "5432:5432"
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:
```

dockerインストールの参照サイト

https://kinsta.com/jp/blog/install-docker-ubuntu/

## flaskを利用したcsvデータ投入

csvデータをflask-sqlalchemyを利用して、DBに投入します。
```
from mysite import db, app
from mysite.models.Spotify import Spotify
import pandas as pd

def laod_csv_db(path):
    data = pd.read_csv(path)
    with app.app_context():
        for index, row in data.iterrows():
            print(index)
            one = Spotify(
                spotify_id = row["id"],
                name = row["name"],
                genre = row["genre"],
                artists = row["artists"],
                album = row["album"],
                popularity = int(row["popularity"]),
                duration_ms = int(row["duration_ms"]),
                explicit = row["explicit"],
            )
            db.session.add(one)
        db.session.commit()
    

if __name__ == '__main__':
    laod_csv_db('mysite/data/spotify_tracks.csv')
```

# 最後に
この記事では、新人エンジニアの皆さんを対象に、Flaskを使ったDB接続と初期設定、そしてWebサイト上でのテーブル表示とグラフ表示の方法について解説しました。これらの基本的なスキルは、Webアプリケーション開発の基盤となるものであり、理解しておくことで今後のプロジェクトに大いに役立つでしょう。

Flaskの導入から始めて、データベースとの接続方法、そしてデータを視覚的に表示する方法まで、基本的な流れを学んでいただけたかと思います。今回の記事を参考に、さらに自分自身のプロジェクトに応用し、より高度な機能を実装してみてください。

もしこの記事が役に立ったと感じたら、ぜひ他の記事もチェックしてみてください。また、何か質問やフィードバックがあれば、コメント欄でお気軽にお知らせください。皆さんの学習と開発の成功を心から願っています！