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

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

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

コメントする

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


The reCAPTCHA verification period has expired. Please reload the page.

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