メモ_FlaskアプリでDBから指定範囲のデータをjsonでダウンロードさせる機能の追加

Flaskで構築したWebアプリに、DBから指定した範囲のデータをjson形式でダウンロードさせる処理を追加する際のメモ。

 

サンプルの仕様:

id(連番)、prime_list(素列を格納)というカラムがあるDB(DB名はnuminfo、table名はrime_num)から、idないしprime_listの範囲を指定してデータを取得する。例えば、id=1〜id=100なら、100番目までの素数の値がjsonで得られる。

 

手順1. データを取得する関数を定義

db_utils.pyはデーテベース接続とデータ取得処理をまとめたもの。別途、app.pyから呼び出す


# db_utils.py
import mysql.connector

def get_data_by_id_range(start_id, end_id):
    try:
        # MySQL接続情報の設定 (必要に応じて変更)
        db_config = {
            'host': 'localhost',
            'user': 'ユーザー名を入れる',
            'password': 'パスワードを入れる',
            'database': 'numinfo'
        }

        # MySQLサーバに接続
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor()

        # idの範囲を指定してデータを取得
        query = f"SELECT prime_num FROM prime_list WHERE id >= {start_id} AND id <= {end_id}"
        cursor.execute(query)
        data = [row[0] for row in cursor.fetchall()]

        cursor.close()
        conn.close()

        return data

    except Exception as e:
        print("エラーが発生しました:", e)
        return []

# 同様に prime_num の範囲を指定してデータを取得する関数を追加する

手順2. json取得画面のテンプレートにformを設置。post先の「/get_data」はapp.pyで定義(手順3で説明)

便宜上、テンプレートはhome.htmlとする。以下のformタグを入れる


    <h1>データ取得フォーム</h1>
    <form method="post" action="/get_data">
        <label for="form_type">取得タイプ:</label>
        <select name="form_type" id="form_type">
            <option value="id_range">ID範囲</option>
            <option value="prime_num_range">素数範囲</option>
        </select>
        <br>
        <label for="start_range">開始範囲:</label>
        <input type="text" name="start_range" id="start_range">
        <br>
        <label for="end_range">終了範囲:</label>
        <input type="text" name="end_range" id="end_range">
        <br>
        <input type="submit" value="データ取得">
    </form>

手順3.ユーザーが入力した範囲に応じてデータを取得し、JSONファイルを出力する処理する先として「/get_data」を定義する

以下をapp.pyとかに記載する。これで、formを置いてあるWebページから、条件にそったjsonがダウンロードできるようになります。


#db_utils.pyをここで呼び出す
import db_utils

#以下、中略


@app.route('/get_data', methods=['POST'])
def get_data():
    form_type = request.form['form_type']
    start_range = int(request.form['start_range'])
    end_range = int(request.form['end_range'])

    if form_type == 'id_range':
        data = db_utils.get_data_by_id_range(start_range, end_range)
        output_file = 'prime_id_output.json'
    else:
        data = db_utils.get_data_by_prime_num_range(start_range, end_range)
        output_file = 'prime_num_range_output.json'

    # JSONファイルにデータを書き込む
    with open(output_file, 'w') as json_file:
        json.dump(data, json_file)

    # レスポンスにContent-Dispositionヘッダーを設定して、ブラウザがダウンロードするようにする
    response = Response(json.dumps(data), content_type='application/json')
    response.headers['Content-Disposition'] = f'attachment; filename={output_file}'

    return response
結果:

下記のように成功しました。formで指定した内容にそったデータがjsonでダウンロードされて、無事にエディターで開けました。