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でダウンロードされて、無事にエディターで開けました。