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