cgiで掲示板を作ってみる(2)
2008/05/03
いろいろと妥協した結果、できました。
#!/usr/bin/python# -*- encoding: utf-8 -*-import sysimport osimport cgiimport cgitb; cgitb.enable()import datetime db_file_name = 'bbs.db' script_name = os.environ['SCRIPT_NAME']def output_header(title = 'no title'): "レスポンスヘッダとHTMLのヘッダ部分を出力する。"print '''Content-type: text/html; charset=utf-8"<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>%s</title></head><body>''' % (title)def output_footer():print '''</body></html>'''def get_action(): "アクション関数を取得する。" action = Falseif os.environ.has_key('PATH_INFO'): action_name = os.environ['PATH_INFO']try:if action_name: action = eval(action_name[1:])except:passreturn actiondef get_db():try: f = open(db_file_name, 'r') lines = f.readlines() f.close()except IOError: output_header('error')print '<h1>IO ERROR: データの読み込みに失敗しました。</h1>' output_footer() sys.exit()return linesdef append_db(line):try: f = open(db_file_name, 'a') f.write(line) f.close()except IOError: output_header('error')print '<h1>IO ERROR: データの保存に失敗しました。</h1>' output_footer() sys.exit()def redirect_to(uri):print 'Status: 302 Moved Temporary.'print 'Location: %s/%s\n' % (script_name, uri)print ''def view(form): "アクション関数 掲示板を表示する" lines = get_db() output_header('bbs')print '''<h1>bbs</h1><table>'''for line in lines: time, name, text = line.split('\t')print '''<tr><td>%s</td><td>%s</td><td>%s</td></tr>''' % (cgi.escape(time), cgi.escape(name), cgi.escape(text))print '''</table><form action="%s/register" method="post">名前<input name="name" type="text" style="width:80px;">内容<input name="text" type="text" style="width:300px;"><input type="submit" value="投稿"></form>''' % script_name output_footer()def register(form): timespamp = datetime.datetime.now().strftime('%y/%m/%d: %H:%M:%S') line = '%s\t%s\t%s\n' % (timespamp, form.getfirst('name'), form.getfirst('text')) append_db(line) redirect_to('view')def main():#アクション関数の取得 action = get_action()if not action: redirect_to('view') sys.exit()#アクション関数の実行 action(cgi.FieldStorage()) main()# vim: set ts=4 sw=4 sts=4 expandtab :
思ったことなど
- 掲示板という題材が良くなかったかもしれない。
- PATH_INFOを使った土台を作るほどのものではなかった。
- 実質一画面しかないし。
- そう言えばクラス使ってない。まぁ単純なcgiなら必要ないか。DBアクセスとかも無いし。
- 100行で掲示板を書けたけど長いのか短かいのか良くわかりません。
- htmlを直書きするのはやっぱり汚い。
- ファイル入出力は簡単だった。エラー処理はIOErrorを補足すればいいらいい。
- 定数は、無い? ググったら、property()使えとか書いてあったけど、定数のためにクラス作るってことなんだろうか。ま、他のLLも似たようなものかな。