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

pythonを触りはじめたものの、どうも気分的にのって来ないorz.

それでも、なにか適当なものを作ってみようとして、やっぱり最初はcgiにしました。テキストファイルにデータを保存するようにすれば*1、入出力もできるし。文字列操作もできるし。

まずは、骨組みになる部分から書きはじめました。

#!/usr/bin/python# -*- encoding: utf-8 -*-import sysimport osimport cgiimport cgitb; cgitb.enable()# db = open('bbs.db', 'rw')def output_header():
"レスポンスヘッダを出力する。"print "Content-type: text/html; charset=utf-8"print ""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 view(form):
"アクション関数 掲示板を表示する"
output_header()print 'こんにちわ'#アクション関数の取得
action = get_action()if not action:print 'Status: 302 Moved Temporary.'print 'Location: %s/view\n' % os.environ['SCRIPT_NAME']print ''
sys.exit()#アクション関数の実行
result = action(cgi.FieldStorage())# vim: set ts=4 sw=4 sts=4 expandtab :

思ったことなど

  • cgitb; cgitb.enable() だと、ド派手なエラー画面がブラウザに表示された。
  • PATH_INFOを取得して、同名の関数をアクションとして実行する仕組みにした。
  • cgiのモジュール(cgi.py)が、妙にシンプル。レスポンスヘッダも自前で出力しなければならないのかな。
  • PATH_INFOを取るために、環境変数に自前でアクセスしなければならないのかな。
  • リダイレクトの仕組みも自前
  • pythonでは、大きなフレームワークに乗る以外の選択肢は、マイナーなのかもしれません。
  • PATH_INFOで受けた文字列を元にして文字列と同じ名前の関数を実行したかった。evalを使っちゃったけど、もっと良い方法があるに違いない。とは思った。
  • pythonらしい解決方法とか考え方というのが理解できていないようなので、どうにも書いててしっくり来ない。

追記:20080503 exitは、replでは効くけど、通常は、import sysして、sys.exit()しないとならないようです。修正しました。

*1:勿論実用のためではないので、同時アクセスとかは無視の方向で

コメントする

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


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

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