データベースにデータを保存する

シリアライズすることで、データをファイルに保存できるようになったのが、前回までの成果。現実問題として、複数人が同じデータを扱うことを想定すると、排他制御が必要になる。そのためには、データベースを使うのがよいというのは常識だ。そこで、手軽に使えるSQLiteを利用して、データを保存する方法を試みた。
ユーザがブラウザで情報を入力して、submitする。ここでは、とりあえずユーザIDとパスワードということにしておく。UI画面は以下の通り。

下記のidandpassdb.htmlにアクセスすると表示される画面。

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
  <form action="/cgi-bin/idandpassdb.py" method="POST">
    Input user ID and password<br />
    <input type="text" name="usrid" size="20" maxlength="10"/><br />
    <input type="password" name="passwd" size="20" maxlength="10"/>
    <br />
    <input type="submit" name="submit" />
  </form>
</body>
</html>

サーバ側では以下のスクリプトが動く。データベースファイルdbfile.datを作成し、ユーザが入力した情報(ユーザIDとパスワード)を保存する。その後、データベースのデータをすべて読み込み、レスポンスを返す。

#!/usr/bin/env python

import cgi
import sqlite3

form = cgi.FieldStorage()
userid = form.getvalue('usrid', '')
userps = form.getvalue('passwd', '')

con = sqlite3.connect('./dbfile.dat') #コネクションオブジェクト作成
cur = con.cursor() #カーソルオブジェクト作成

try:
    cur.execute("""CREATE TABLE usrinfo (
                   uid text, passwd text);""") #テーブル作成
except:
    pass

cur.execute("""INSERT INTO usrinfo (uid, passwd) #データの登録
               VALUES ('%s', '%s');""" % (userid, userps))

dat = {}
cur.execute("""SELECT uid, passwd FROM usrinfo;""") #データの選択
for res in cur.fetchall(): # すべてのデータを取り出す
    dat[res[0]] = res[1]

con.commit()

print "Content-type: text/html\n"
print "<html><body>\n"
for x in dat.keys():
    print "ID: %s , PASSWORD: %s<br>" % (x, dat[x])
print "</body></html>"

これまでの成果を絵に描くと下の通り。