cgiで掲示板を作ってみる(2)
2008/05/03
いろいろと妥協した結果、できました。
#!/usr/bin/python # -*- encoding: utf-8 -*- import sys import os import cgi import 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 = False if os.environ.has_key('PATH_INFO'): action_name = os.environ['PATH_INFO'] try: if action_name: action = eval(action_name[1:]) except: pass return action def 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 lines def 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も似たようなものかな。