cgiで掲示板を作ってみる(2)

いろいろと妥協した結果、できました。

#!/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も似たようなものかな。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください