Google App Engine:import cgi って何?
Google App Engine のスタートガイドの「webapp を使ったフォームの操作」で紹介されているソースコードの先頭には、「import cgi」と記述されている。これって何のためのものだろう?
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/handlingforms.html
「フォームの操作」に関係するものらしい。スタートガイドには、ただ「cgi は、標準の Python ライブラリに含まれるモジュールです。詳しい情報は、cgi のドキュメントをご覧ください。」とのみ書かれているだけ。そこにあるリンク先の日本語訳のページを探してみた。
cgi
「11.2 cgi -- CGI (ゲートウェイインタフェース規格) のサポート」というのがそれだ。
http://www.python.jp/doc/2.4/lib/module-cgi.html
そこには次のように記されている。「cgi」という名前から連想されることが難しげに書かれている。
「ゲートウェイインタフェース規格 (CGI) に準拠したスクリプトをサポートするためのモジュールです。このモジュールでは、 Python で CGI スクリプトを書く際に使える様々なユーティリティを定義しています。」
拉致があかないので、次のページ「11.2.1 はじめに」に進む。
http://www.python.jp/doc/2.4/lib/cgi-intro.html
「CGI スクリプトは、HTTP サーバによって起動され、通常は HTML の FORM または ISINDEX エレメントを通じてユーザが入力した内容を処理します。 」
なるほど!「FORM でユーザが入力した内容を処理」するものなのか。これで、「cgi」の立ち位置がはっきりした(気がする)。
CGI スクリプトの出力
さらに読み進めると「CGI スクリプトの出力」についての記述に出くわす。
「CGI スクリプトの出力は 2 つのセクションからなり、空行で分割されています。」
そういえば、スタートガイドの最初の「Hello, World!」のページの「簡単なリクエスト ハンドラの作成」の項は、次の記述だった。
print 'Content-Type: text/plain' print '' print 'Hello, world!'
「Content-Type を記述した HTTP ヘッダー、空行、メッセージ Hello, world! でリクエストに応答します。」と説明があったが、真ん中の空行は「HTTP ヘッダー」の終わりを示す役割があるということだ。
スタートガイドの「webapp フレームワークの使用」では、類似の部分が次のように記述されている。
class MainPage(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, webapp World!')
空行の出力の記述がない。これは「webapp フレームワーク」が、「HTTP ヘッダー」と本文を分離する手続きを行ってくれると解釈すればいい。おそらくスタートガイドにある「Web アプリケーション フレームワークは瑣末な作業を処理してくれる」という瑣末な作業の一つなのだろう。
なお、HTMLを出力する場合の「HTTP ヘッダー」は、"Content-Type: text/html" となる。
cgi モジュールを使う
続くPython ライブラリリファレンス「11.2.2 cgi モジュールを使う」のページをめくる。
http://www.python.jp/doc/2.4/lib/node457.html
そこには、「import cgitb; cgitb.enable()」と記述することの推奨、入力されたフォームデータを取得するには、 FieldStorage クラスを使うのが最良の方法であることが示されている。
しかし、スタートガイドの「webapp を使ったフォームの操作」のページには、FieldStorage クラスは記述されていない。「webapp」がこれに当たる機能を提供していると推測する。
webapp と cgi
Google App Engine で webapp を利用して、フォームデータの処理を行うには、cgi モジュールをインポートしておく必要があると理解すればいいのかもしれない。初歩的な段階では、そのくらいの押え方で問題ないと思う。