Bottle - フォームデータをリストで受け取る

複数のチェックボックスのデータを一つの変数に格納して受け取りたいときがある。

POST

Bottleの場合フォーム部品のname属性値を同じにして送信する。

from bottle import run, get, post, request

@get('/form')
def func():
    return '''
        <form method="post">
            <input type="checkbox" name="data" value="foo">
            <input type="checkbox" name="data" value="bar">
            <input type="checkbox" name="data" value="baz">
            <input type="checkbox" name="data" value="qux">
            <input type="checkbox" name="data" value="quux">
            <input value="submit" type="submit">
        </form>
    '''

@post('/form')
def func():
    print(request.forms.getall('data'))

run(host='localhost', port=8080, reloader=True)

受信データへのアクセスはrequest.formsのgetall()またはgetlist()の引数にname属性値を指定する。

実際にサーバを建ててlocalhost:8080/formを開き全部にチェックを入れて送信。

127.0.0.1 - - [15/Apr/2021 18:03:32] "GET /form HTTP/1.1" 200 376
['foo', 'bar', 'baz', 'qux', 'quux']
127.0.0.1 - - [15/Apr/2021 18:03:37] "POST /form HTTP/1.1" 200 0

リストで受け取れた。

GET

クエリ文字列も試そう。こちらはrequest.queryのgetall()を使う。

@get('/form')
def func():
    print(request.query.getall('data'))

localhost:8080/form?data=hoge&data=fuga&data=piyoをリクエスト。

['hoge', 'fuga', 'piyo']
127.0.0.1 - - [15/Apr/2021 18:05:12] "GET /form?data=hoge&data=fuga&data=piyo HTTP/1.1" 200 0

同様にリストで返ってくる。

参考