PythonでPOSTメソッドを使いフォームからデータの習得をする

2015.3.14

th_Python-logo-notext.svgまたPythonです。前回CGIモジュールをインポートしてCGIを使ってみましたね。今回はPOSTメソッドを使ったフォームで、データを取得してみましょう。ざっくりとした解説で行きますが、これをそのまま実装するとか言うのはナシにしてくださいね。実際にHTMLとPythonをどう使うかというのがなんとなくでも分かればいいな、と思っています。

とりあえずさっさとHTMLファイルを用意しよう

まずはフォーム画面をさっさと作ってしまいましょう。


<html>
<head>
<title>Form test</title>
</head>

<body>
<h1>Python Form test</h1><hr>

<form name="Form" method="POST" action="/cgi-bin/form.py">
name: <input type="text" size="30" name="name">
mail: <input type="text" size="30" name="mail">
<input type="submit" value="submit" name="button">
</form>
</body>
</html>

ざっくりですねー。HTMLの基礎知識はあるものとして解説していきます。formタグを使用してメソッドはPOST、/cgi-bin配下にあるform.pyにデータを送ることとします。まだform.pyは作ってませんからご注意!

nameという項目に名前を入れさせる、mailという項目にメールアドレスを入れさせると仮定して作ってみました。このファイルはform.htmlという名前をつけて以前作ったpyworksフォルダ直下に配置しましょう。

form.pyファイルを準備する

実際にデータを受け取って、その結果を出力するためのPythonスクリプトを書きましょう。


#!/usr/bin/env python
import cgi

print "Content-Type: text/html\n"

print "<html><body>"

form = cgi.FieldStorage()
form_check = 0
if form.has_key("name") and form.has_key("mail") :
  form_check = 1
if form_check == 0 :
  print "<h1>ERROR !</h1>"
else :
  print "<h2>PRINT</h2><hr>"
  print "<b>name: </b>", form["name"].value
  print "<b>mail: </b>", form["mail"].value

print "</body></html>"

上記をform.pyとして、以前作ったpyworksの中にあるcgi-binフォルダへ保存してください。 chmodで755を与えるのも忘れずに!

ちょっと休憩スクリプトの中身を解説

import でcgiモジュールをインポートします。

form = cgi.FieldStorage()

で、FiledStorageクラスをインスタンス化してます。インスタンス化、と言うのは用語ですので「ああそういう意味か、位で覚えておきましょう。」

インスタンス化とは、オブジェクト指向のプログラミングにおいて、インスタンス(クラスを基にした実際の値としてのデータ)を生成することである。

通常、インスタンスはクラスと対比して使用される。例えば「名前、身長、体重」というクラスがあるとすれば、そのインスタンスは「佐藤、170、60」というよう風にして作られる。一つのクラスから複数のインスタンスを作ることができ、それぞれのインスタンスは違った値を持つことができる。また、プログラムの中で実際に扱われるのはクラスではなく、こうして作られたインスタンスの方である。 プログラミングの現場では、クラスを定義したあとで変数などの実体を用意するが、こうした処理がインスタンス化と呼ばれる。

用語はなんでそうなるのかとか深く考えだすと勉強が滞ります。用語の意味だけ把握しておきましょう。

で、話は戻りますがインスタンス化してフォームの内容を受け取ろう、ということになってるわけですね。送られてきた内容に、期待する値が含まれているかどうかを判断しているのがこの部分。


if form.has_key("name") and form.has_key("mail") :

has_key メソッド というものでで確認しているわけです。値がフォームに存在していればその値を取得し返して表示しているだけ。ということになってます。if というのは「もし〜であれば こう」という命令で、else というのは「上記全部あてはまらなければ こう」という命令だと思ってください。基本的にプログラムは上から順番に実行されていきます。

もっと細かく解説


#!/usr/bin/env python #おまじない
import cgi #cgiモジュールをインポートする

print "Content-Type: text/html\n\n" #htmlファイルを表示するためのおまじないをする

print "<html><body>" #print 以下の文字列""の中身を表示する

form = cgi.FieldStorage() #インスタンス化してる
form_check = 0 #form_check を 0 としている
if form.has_key("name") and form.has_key("mail") : #もし期待する値が name そして mailなら以下のように処理 という命令
  form_check = 1 # form_check は 1だお
if form_check == 0 : #もし form_checkが0だったら以下のように処理しろという命令
  print "<h1>ERROR !</h1>" #print で文字列""の中身を表示
else : #上記 if が全部当てはまらかなったら以下のように処理しろ という命令
  print "<h2>Result</h2><hr>" #print で〜以下略
  print "<b>name: </b>", form["name"].value
  print "<b>mail: </b>", form["mail"].value

print "</body></html>"

ここで覚えておきたいのは form_check というのは名前をプログラムする人が勝手につけて定義している箇所なので、 form_in とか名前を変えても動きます。こういうものを「変数」と呼びます。変数 = オブジェクト になっていると覚えてください。名札がついてるわけです。

form_check = 0 #変数 = オブジェクト

というわけですね。いかがでしょうか無事ついてこれてますか。では実際に動かしてみましょう。

フォームを動かそう

ではいよいよ動かしましょう。前回作ったcgiserver.pyをシェルから起動してください。


$ python cgiserver.py

これで http://127.0.0.1:8000/form.html をブラウザに打ち込んで表示させましょう。無事フォームが出ていますか?実際に入力してsubmitボタンで送信してみましょう。双方に値が入っていない場合はERRORという表示が帰ってくるはずです。動作が理解できたら、form.pyスクリプトの中身を書き換えて違う内容を表示させてみましょう。