SQLiteによる簡単なデータベースを使用し,Flaskで表を作成する方法について.

目次

  1. スクリプト
  2. データベース
  3. テンプレート
  4. 異なる階層で処理する場合

スクリプト

from flask import Flask, render_template, request, g
import sqlite3

app = Flask(__name__)

def get_db():
if 'db' not in g:
g.db = sqlite3.connect('my_db.db')
return g.db

@app.route('/', methods=['GET', 'POST'])
def index():
conn = get_db()
if request.method == 'GET':
return render_template('my-list.html')
elif request.method == 'POST':
my_post = request.form["my_post"]
cur = conn.execute("SELECT id, price FROM mytable")
data = cur.fetchall()
conn.close()
return render_template('my-list.html', my_post = my_post, data = data)

if __name__ == "__main__":
app.debug = True
app.run(host='0.0.0.0')

データベース

スクリプトでimport sqlite3としている通り,データベースをSQLiteで作成.
ここでの仮のデータベースはmy_db.db,テーブルをmytableとしている.

テンプレート

Flaskで用いるHTMLファイルのテンプレートはtemplatesフォルダに配置する.
ここではmy-list.htmlとする.

<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>

<h1>表作成</h1>
<p>
検索ボックスに品番を入力ください.<br>
対応する価格を検索します.
</p>
<form action="/" method="post">
<input type="text" name="my_post" value="事前に入っている値">
<input type="submit" value="検索">
</form>

<h2>{{ my_post }}</h2>

{% if data %}
<table border="1">
<thead>
<tr>
<th>品番</th>
<th>価格</th>
</tr>
</thead>
<tbody>
{% for item in data %}
<tr>
<td>{{item[0]}}</td>
<td>{{item[1]}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}

</body>
</html>

スクリプト中のrender_templateが,表の作成を動的に処理してくれる.

  1. スクリプトからmy_postdataが代入される.
  2. マスタッシュ記法で書かれた{{ my_post }}により,フォームに入力した値を(スクリプトを経由して)表示している.
  3. {% for item in data %}` 〜 `{% endfor %}は検索結果を反復して呼び出し,行を追加する.
  4. {% if data %}` 〜 `{% endif %}により,検索結果がヒットしたときのみ表を作成する.

異なる階層で処理する場合

ルートを/から次のように/dir/に変更する.

@app.route('/dir/', methods=['POST'])

テンプレートでは,

<form action="/" method="post">

<form action="/dir/" method="post">