データベースにデータを保存する
シリアライズすることで、データをファイルに保存できるようになったのが、前回までの成果。現実問題として、複数人が同じデータを扱うことを想定すると、排他制御が必要になる。そのためには、データベースを使うのがよいというのは常識だ。そこで、手軽に使える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>"