【Python】FlaskでWebアプリケーションを作る⑤ -DBから取得したPandasテーブルを画面に表示する

これまでFlaskでWebアプリケーションを構築する方法について紹介してきましたが、今回はGETメソッドでのリクエストに応じてデータベースから取得したデータをテーブル形式で画面に表示してみようと思います。

過去のFlaskに関する記事は以下からご覧ください。

https://www.learning-nao.com/?tag=flask

前提

Pythonパッケージ

今回使用するPythonパッケージは以下の通りです。

  • Flask
  • Pandas
  • psycopg2(PostgreSQL操作用)

DB

今回はPostgreSQLを用います。”dvdrental”というデータベースを用意し、支払情報テーブルからデータを取得します。

"dvdrental"のpaymentテーブル

実装

まずは今回のコード全体です。pythonはmain.py、結果を表示する画面はresult.htmlに記述しています。

from flask import Flask, render_template, request
import psycopg2
import pandas as pd

app = Flask(__name__)

# PostgreSQLへの接続
conn = psycopg2.connect(
    user="xxxx",        #ユーザ
    password="xxxxx",  #パスワード
    host="localhost",       #ホスト名
    port="5432",            #ポート
    dbname="dvdrental")    #データベース名
    
@app.route('/')
def get_version():
    cur = conn.cursor()
    cur.execute('SELECT version()')
    version = cur.fetchone()[0]
    return f'PostgreSQL version: {version}'

@app.route('/result', methods=["GET"])
def result():
# GET送信の処理
    user_id = request.args.get("user_id","")
    print(user_id)

    sql = "select * from payment where customer_id='{}'".format(user_id)
    df = pd.read_sql(sql, conn) 

    return render_template('result.html', table=(df.to_html(classes="mystyle")))


if __name__ == '__main__':
    app.run(host='localhost')
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>mystyle</title>
    <style type="text/css">
        body {
                font-family: Arial, Verdana, sans-serif;
                font-size: 90%;
                color: #666;
                background-color: #f8f8f8;}
        </style>
</head>
<body>
        <h1>支払情報</h1>    
        {{table | safe}}
</body>
</html>

PostgreSQLの接続

まずはデータベースオブジェクトconnを作成します。

# PostgreSQLへの接続
conn = psycopg2.connect(
    user="xxxx",        #ユーザ
    password="xxxxx",  #パスワード
    host="localhost",       #ホスト名
    port="5432",            #ポート
    dbname="dvdrental")    #データベース名

PythonからPostgreSQLへの接続については以下記事にまとめています。

DBとの接続を確認してみる

おまけみたいな内容にはなりますが、DBとの接続確認をWebを通してやってみます。

以下のような関数を用意します。接続したPostgreSQLのバージョンを取得し表示します。

#PostgreSQLのバージョンを取得し返す   
@app.route('/')
def get_version():
    cur = conn.cursor()
    cur.execute('SELECT version()')
    version = cur.fetchone()[0]
    return f'PostgreSQL version: {version}'

Webアプリケーションを起動し、当該URLを確認してみます。

PostgreSQL version: PostgreSQL 13.1, compiled by Visual C++ build 1914, 64-bit

バージョンを取得できたので、DBと接続できていることを確認できました。

検索結果のテーブルを画面に表示する

ここからがメインのところになります。今回はGETメソッドでパラメータを受け取り、そのパラメータ値でDBを検索した結果をテーブル形式でHTMLに渡し、画面に表示します。

@app.route('/result', methods=["GET"])
def result():
# GET送信の処理
    user_id = request.args.get("user_id","")
    print(user_id)

    sql = "select * from payment where customer_id='{}'".format(user_id)
    
    df = pd.read_sql(sql, conn) 
    
    
    return render_template('result.html', table=(df.to_html(classes="mystyle")))

基本ロジック

GETメソッドでパラメータを受け取る場合は、デコレータ(@から始まる行)に明記します。もう1つPOSTメソッドもありますが、今回は使用しません。使用する場合はGETをPOSTに置き換えるか、両方使う場合は配列形式で両方を指定します。

request.args.get()ではパラメータの値を取得します。今回は”user_id”という名称のパラメータを取得します。

取得したuser_idはSQL文のWHERE句に入れ、動的に結果を取得するようにします。DBからの取得結果はPandasデータフレームに格納します。

取得結果のデータフレームはテーブル形式でresult.htmlに渡します。

HTMLにPandasデータフレームを渡す

Pandasのデータフレームオブジェクトにはto_htmlというメソッドが用意されており、データフレームをHTML形式に変換することができます。変換したものを結果を表示するHTMLに組み込むことで、テーブルを表示させています。

HTMLの変数tableにdf.to_html()の結果を渡します。

return render_template('result.html', table=(df.to_html(classes="mystyle")))
<body>
        <h1>支払情報</h1>    
        {{table | safe}}
</body>

動作確認

では、作成したFlask Webアプリケーションを起動して結果を確認してみます。

GETメソッドではパラメータをURLにて渡します。試しにブラウザで以下のようなURLを実行してみます。

http://localhost:5000/result?user_id=341

URLの?以降にパラメータを指定します。今回はuser_idが341のデータを取得してみます。

user_idが341のデータ

user_id(customer_id)が341のデータを表示できました。

まとめ

Flaskを使ってGETメソッドでのリクエストに応じてデータベースから取得したデータをテーブル形式で画面に表示させてみました。GETメソッド(POSTメソッド)を使ってデータの授受ができると、Webアプリケーションとしての幅が大きく広がります。

またDBやPandasも組み合わせて簡単にデータを見せることができるので、是非活用してください^^

ではでは👋