LoginSignup
15
16

More than 3 years have passed since last update.

python-cgiモジュールのFieldStorage型について

Last updated at Posted at 2019-07-29

はじめに

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処理などを簡単に行えます。
とても便利。

15
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16