$3 ブラウザからのデータの取得

3-2 フォームからのデータ取得 その1

フォームからの入力の説明です。 まずは、テキスト入力以外の、ラジオボタン、セレクトメニューなどのフォームからのデータの処理について述べます。 テキスト入力の場合、文字コード変換などの問題などがあり、ややこしい処理が必要になります。 それ以外のフォームでは、自分が用意したデータのみを処理すればいいので簡単になります。

まず、HTMLでフォームを作る場合を見ましょう。

<FORM METHOD="GET" ACTION="ex2.cgi">
 <H3>ページの色を決めてください</H3>
<DL>
<DT>背景の色
<DD><INPUT TYPE="radio" NAME="Back" VALUE="White" CHECKED>白
<DD><INPUT TYPE="radio" NAME="Back" VALUE="Yellow">黄色
<DD><INPUT TYPE="radio" NAME="Back" VALUE="Green">緑
<DD><INPUT TYPE="radio" NAME="Back" VALUE="Orange">オレンジ
<DT>文字の色
<DD><INPUT TYPE="radio" NAME="Text" VALUE="Black" CHECKED>黒
<DD><INPUT TYPE="radio" NAME="Text" VALUE="Blue">青
<DD><INPUT TYPE="radio" NAME="Text" VALUE="Red">赤
<DD><INPUT TYPE="radio" NAME="Text" VALUE="Purple">紫
</DL>
<INPUT TYPE="submit">
<INPUT TYPE="reset">
</FORM>

実際のページでは、下のように表示されます。


ページの色を決めてください

背景の色
黄色
オレンジ
文字の色

このページでボタンが押された場合、データはどうなるのでしょうか。 (ちなみに、本当に押すと「Ruby」で作られたCGIが動作します)
ここで重要なのは、HTMLの中の「NAME="Q1" VALUE="A"」という部分です。 CGIへデータとして送られるのは、この NAMEとVALUEのペアが連結したものです。 本来はCGIプログラムで、この連結されたデータを切り離す作業が必要です。
Pythonでは、その作業をやってくれる「cgi」というライブラリがあるので、それを使います。

  1: #! /usr/bin/python
  2: 
  3: import cgi
  4: Data = cgi.FieldStorage()
  5: 
  6: BackColor = Data['Back'].value
  7: TextColor = Data['Text'].value
  8: 
  9: print "Content-type: text/html\n\n"
 10: print "<HTML><BODY BGCOLOR=%s TEXT=%s>" % (BackColor, TextColor)
 11: print "<H1>こんにちは</H1></BODY></HTML>"

3行目で、cgiライブラリをインポートします。
4行目では、天下りな説明になりますが、送られて来たデータを取り出すために 「FieldStorage()」という関数を使います。 ここで「Data」というのが、FieldStorageクラスから作られたオブジェクト(インスタンスと呼ばれる)になります。

6行目、7行目で実際のデータを取り出してます。ここも天下りになりますが、 「Data['Back'].value」とは、 もとのページの HTMLの「NAME="Back" VALUE="White"」の部分で選ばれた VALUEの値、 ということになります。
言い換えれば、もとのページの「Back」で「White」が選ばれた場合、 「Data['Back'].value」の値は「White」となり、変数 BackColorに入ります。 同様に7行目で、ページの「Text」で選ばれた VALUEの値が、変数TextColorに入ります。

10行目で、表示するページのHTMLを出力しますが、この例では、ページの色を変えるので、 BODYタグの一部を変数に置き換えます。
ここでは「%s」を使ってます。10行目の「 % 」以後のかっこの中の変数が、 そのままの順で、前半部分の「%s」に置き換えられます。
もっと一般的に書くと、 「print "%s は %s" % (X, Y) 」と書いたとき、変数 X、Yの値が「バラ」「赤い」だとすると、 「print "バラ は 赤い"」と書くのと同じになります。

注意: ここでは、送られてきたデータ(White、Blackなど)を、何も加工せずにそのままHTMLの文に入れて使える、という、 理想的な状況にあることを仮定しています。 しかし、実際のプログラムでは、変なデータが入ってきた場合の処理も必要です。

POSTとGETについて:
Pythonでは「FieldStorage()」を使う場合、送られてきたデータがPOSTかGETかには関係なく、 同じ方法でデータを取り出すことができます。


Next: 3-3 フォームからのデータ取得 その2

Previous: 3-1 リンクによるデータ取得

Contents


Foundation of CGI Page

春風はるか haruka@harukaze.net