はじめに
pythonでwebページ間でデータをやりとりする為に
cgiモジュールを使った際に
調べたcgi.FieldStorage型について整理しました。
Pythonの公式ドキュメントはこちら
https://docs.python.org/3/library/cgi.html
python-cgiについての記事はこちら
https://qiita.com/Taro_man/items/82fb537688e0f2be4915
cgi.FieldStorage
cgiモジュールで使用されているクラス。
FieldStorageクラスをインスタンス化することで、
クライアントから送られるフォームの内容を取得できるようになる。
主な使い方
pythonファイルが実行された<form></form>
に紐付くhtmlタグを取得する。
例えば、以下のような記述を html と python に書いた場合、変数formの中身は次のようになる。
変数form(FieldStorage型)
(None, None, [MiniFieldStorage('hdn_name', 'hdn_value1'), MiniFieldStorage('hdn_name', 'hdn_value2'), MiniFieldStorage('text_name', 'text_value'), MiniFieldStorage('button', 'submit!!')])
# Python
form = cgi.FieldStorage()
<!-- HTML -->
<form name="formSubmit" action="cgibin.py">
<input type="hidden" name="hdn_name" value="hdn_value1">
<input type="hidden" name="hdn_name" value="hdn_value2">
<input type="text" name="text_name" value="text_value">
<input type="submit" name="button" value="submit!!">
</form>
データの取り出し方
上記のhtml, cgi.FiledStorageインスタンスを例に
フォームのデータを取り出す方法を以下に記載します。
注釈
以降の説明では例の
name="hogename"に当たる部分をhtml_name,
value="hogevalue"に当たる部分をhtml_value と表現します。
<!-- (例) -->
<input type="hidden" name="hogename" value="hogevalue">
form.getvalue(name)
指定したhtml_nameに紐付く、全てのhtml_valueを返す。
紐付くhtml_nameが
1つの場合はString型、複数ある場合はlist型で返す。
# 例1)
# 変数名:格納されるデータ:型
# ret:'text_value':<class str>
ret = form.getvalue('text_name')
# 例2)
# 変数名:格納されるデータ:型
# ret:['hdn_value1', 'hdn_value2']:<class list>
ret = form.getvalue('hdn_name')
上記の通り、
html_nameの数によって、返ってくる型が異なるので、バグ懸念があります。
個人的には、後述の**form.getlist()**を使った方が良いと思います。
form.getlist(name)
指定したhtml_nameに紐付く、全てのhtml_valueを返す。
紐付くhtml_nameの数に関わらず、list型で返す。
# 例1)
# 変数名:格納されるデータ:型
# ret:['text_value']:<class list>
ret = form.getlist('text_name')
# 例2)
# 変数名:格納されるデータ:型
# ret:['hdn_value1', 'hdn_value2']:<class list>
ret = form.getlist('hdn_name')
form.list
pythonファイルが実行された<form>
タグに紐付く、html_nameとhtml_valueをlistで返す。
listの要素はMiniFieldStorage型。
MiniFieldStorage型は、辞書型のように(key, value)形式でデータを持つ。
# 例)
# 変数名:格納されるデータ:型
# ret:[MiniFieldStorage('hdn_name', 'hdn_value1'), MiniFieldStorage('hdn_name', 'hdn_value2'), MiniFieldStorage('text_name', 'text_value'), MiniFieldStorage('button', 'submit!!')]:<class list>
ret = form.list
htmlタグを全部取ってきて
XXXというhtml_valueがあれば処理1、
YYYというhtml_valueがあれば処理2 というような分岐処理に使える。
form[name]
指定したhtml_nameとそれに紐付くhtml_valueをMiniFieldStorage型で返す。
紐付くhtml_nameが複数ある場合、list型 of MiniFieldStorage型で返す。
# 例1)
# 変数名:格納されるデータ:型
# ret:MiniFieldStorage('text_name', 'text_value'):<class MiniFieldStorage>
ret = form['text_name']
# 例2)
# 変数名:格納されるデータ:型
# ret:[MiniFieldStorage('hdn_name', 'hdn_value1'), MiniFieldStorage('hdn_name', 'hdn_value2')]:<class list>
ret = form['hdn_name']
form[name].value
指定したhtml_nameに紐付く、html_valueをString型で返す。
ただし、紐付くhtml_nameが複数ある場合、
form[name]がlist型で返ってくる為、AttributeErrorが発生する。
# 例1)
# 変数名:格納されるデータ:型
# ret:'text_value':<class str>
ret = form['text_name'].value
# 例2)
# raise AttributeError
ret = form['hdn_name'].value
まとめ
以上のようにcgi.FieldStorageを使ってフォームの情報を取り出す事で
Webページ間のデータの受け渡しや動的なhtml処理などを簡単に行えます。
とても便利。