2008年08月04日

PythonでCGIを書く

CGIと言えばいまだにPerlが主流ですが、PythonはCGI用のライブラリも標準で用意されており、特別なパッケージを別途インストールする必要無しに、簡単にCGIを作成することができます。

CGI作成に使うのは、その名の通りcgiモジュールです。

cgiモジュールの使い方は非常に簡単で、import cgiをした後に form = cgi.FieldStorage() とするだけで、フォームの内容を取得できます。メソッドがPOSTかGETかだとか、そんなことは一切気にする必要はありません。この一行だけで、後はformを介してフォームの値にアクセスできます。

例えば掲示板の名前入力欄にnameという名前を付けていれば、form['name'].valueでname欄に入力された値が取得できます。'name'が存在しない場合はKeyErrorの例外が投げられますが、getvalueメソッドを使って name = form.getvalue('name', '名無しさん') のようにすると例外の代わりにデフォルト値を返してくれます。

'name'に該当する項目が1つだけならば、form['name'].valueは文字列を返しますが、チェックボックス等は同じ名前で複数の項目を使用することがあります。その場合に同名の項目が2つ以上選択されていると、form['name'].valueはリストを返します。同名の項目数に関わらず、常に単一の文字列を返して欲しい場合はgetfirstメソッドを、逆に常にリストで返して欲しい場合はgetlistメソッドを使います。

フォームからファイルをアップロードした場合は、form['name']はファイルオブジェクトになります。アップロードされたファイルの読み取りは普通のファイルと同じように行います。オリジナルのファイル名はform['name'].filenameで、MIMEタイプはform['name'].typeで取得できます。

投稿サイズに制限を設けたい場合は、import cgiの後でcgi.FieldStorage()を呼ぶ前に、cgi.maxlen = 102400 のようにバイト単位で指定します。フォームの内容がこのサイズを超えていると、cgi.FieldStorage()がValueErrorの例外を投げます。(ただし他のエラーでもValueErrorを投げるので、厳密に判定したければエラーメッセージを調べる必要がある)

掲示板CGI等でよく使う、<>&"のエスケープもcgiモジュールに用意されていて、s = cgi.escape(s) でエスケープされた文字列が得られます。デフォルトでは"をエスケープしてくれないので、それもエスケープして欲しい場合は、 s = cgi.escape(s, True) のようにします。

Pythonの強力なライブラリのおかげで、単純な掲示板くらいならあっという間に作ることができます。CGIを配布する場合も、余計なライブラリは必要ないのでライセンス等を気にしなくていいのは気楽です。

タグ:Python
2008年08月04日 【プログラミング】 | コメント(0) |

この記事へのトラックバック
この記事へのコメント

コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。