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) に準拠したスクリプトをサポートするためのモジュールです。このモジュールでは、 PythonCGI スクリプトを書く際に使える様々なユーティリティを定義しています。」

拉致があかないので、次のページ「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 モジュールをインポートしておく必要があると理解すればいいのかもしれない。初歩的な段階では、そのくらいの押え方で問題ないと思う。