フォームデータの取得

PythonでHTMLを表示できたので次はフォームからのデータ取得を試してみる

・入力画面

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
  </head>
  <body>
    <form action="action.py" method="post">
      ■チェックボックス<br>
      <input type="checkbox" name="chkbox" value="aaa">aaa
      <input type="checkbox" name="chkbox" value="bbb">bbb
      <input type="checkbox" name="chkbox" value="ccc">ccc
      ■ラジオボタン<br>
      <input type="radio" name = "radio" value="radio1">radio1
      <input type="radio" name = "radio" value="radio2">radio2
      ■テキストボタン<br>
      <input type="text" name="text"><br>
      ■メモ<br>
      <input type="textarea" name="memo"><br>
      ■ボタン<br>
      <input type="submit" name="btn" value="button1">button1
      <input type="submit" name="btn" value="button2">button2
      <input type="submit" name="btn" value="button3">button3
    </form>
  </body>
</html>

・フォーム入力データ取得&表示プログラム

#!d:\Python25\python.exe
#coding:utf-8
'''

'''
import  cgi
import  cgitb; cgitb.enable() #エラー発生時にブラウザ上に表示させる、デバック時のみ利用がおすすめ

print "Content-Type: text/html"
print 
html = '''<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>'''
print html
print "Hello World"
print "日本語<br>"
print "cgi.test()結果"

fs = cgi.FieldStorage()

#チェックボックス
chkbox = fs.getlist("chkbox")#つねにリストにして返す、値がない場合は空のリスト、getfirstは最初の値だけ返すが順番は保障しない
for item in chkbox:
  print "name:chkbox=",  item,"<br>"
#ラジオボタン
radio = fs.getlist("radio")
for item in radio:
  print "name:radio=",  item,"<br>"
#テキスト
#text = fs["text"].value.decode("shift-jis")#同一名のフィールドの場合はインスタンスのリストになる
text = fs.getvalue("text").decode("shift-jis")
print "name:text=" , text.encode("utf-8"),"<br>"
#メモ
memo = fs.getvalue("memo").decode("shift-jis")
print "name:memo=" , memo.encode("utf-8"),"<br>"

#ボタン
btn = fs.getlist('btn')#同名ボタンが存在しているパターン
for item in btn:
  print "name:btn=",  item,"<br>"

print '<a href="index.html">index</a>'
print "</body>"
print "</html>"

【テストしてみて】
今回は入力フォームををShift-JISで作成したため日本語が入力されるテキストボックスはデコードして変数に格納、取得データの表示はUTF-8で出力してみた

  • cgiモジュールを使う事でgetでもpostでも意識せずフォームに入力されたデータの取得が可能みたい
  • チェックボックスラジオボタンは常にリスト形式で取得するgetlistメソッドを使うようにしておこう
  • getvalueメソッドを使わなくてもキー指定(例:fs["text"].value)で取得できるけどオンラインドキュメントを読んでいるとメソッドを使う方法に統一しておこうかな。
  • ボタンをgetlistメソッドでデータを取得しているもののgetvalueでも良かったかも。