概要
「Head First Python 第2版」を進めていった中で考えたことの記録です。
Head First Python 第2版 ―頭とからだで覚えるPythonの基本
- 作者:Paul Barry
- 発売日: 2018/03/24
- メディア: 単行本(ソフトカバー)
Webアプリケーションのコード
from flask import Flask, render_template, request from vsearch import search4letters # ...略... @app.route('/search4', methods=['POST']) def do_search() -> str: phrase = request.form['phrase'] letters = request.form['letters'] return str(search4letters(phrase, letters))
上記は、Flaskを用いて構築した、POST
リクエストを受け付けるWebアプリケーションの例となります。
コード各部分について解説
HTTPのリクエストデータを扱うためのオブジェクトをインポートする
from flask import Flask, render_template, request
flask
ライブラリに含まれる関数・クラスのうち、Flask
クラスとrender_template
関数は、これまでに実装してきた機能を使うために必要であった関数・クラスです。
今回新たに、request
という組み込みオブジェクトをflask
ライブラリからインポートしています。request
オブジェクトは、HTTPのリクエストデータをWebアプリケーションで扱うために必要となる関数です。
HTMLフォームのデータを新規の変数に代入する
phrase = request.form['phrase'] letters = request.form['letters']
flask
ライブラリのrequest
オブジェクトには、ポストされてきたHTTPリクエストに含まれるHTMLフォームのデータにアクセスするための辞書属性form
が含まれます。request.form
の内容はPythonの辞書で、各要素のキーはHTMLフォームの各name
属性の値となります。例えば、name
属性の値がphrase
であるinput
要素の内容にWebアプリケーション側からアクセスするためには、request.form['phrase']
という属性にアクセスすればよいということになるわけです。
<form method='POST' action='/search4'> <p>このフォームを使って検索リクエストを送ってください。</p> <table> <tr><td>フレーズ:</td><td><input name='phrase' type='TEXT' width='60'></td></tr> <tr><td>文字:</td><td><input name='letters' type='TEXT' value='aeiou'></td></tr> </table> <p>準備ができたら、以下のボタンを押してください。</p> <p><input value='実行!' type='SUBMIT'></p> </form>
上述HTMLマークアップは、上述Pythonコードで処理するための入力データを生成するHTMLフォームの例です。このHTMLフォームのSUBMIT
処理を実行すると、上述Pythonコードは以下の動作を行います。
- ポストされてきたHTMLフォームのうち、
name
属性の値がphrase
であるinput
要素に入力された文字列を変数phrase
に代入する - ポストされてきたHTMLフォームのうち、
name
属性の値がletters
であるinput
要素に入力された文字列を変数letters
に代入する
curlコマンド等を用い、当該HTMLフォームにより生成されるリクエストと同等のPOST
リクエストを直接投入することも可能です。当該リクエストの必要条件は以下となります。
作成した変数を別の関数で使用し、その戻り値を得る
return str(search4letters(phrase, letters))
このreturn
文に対応する関数do_search
は、「/search4
というURLを持つリソースに対するPOST
リクエスト」に割り付けられたものです。前項で内容を定義したphrase
およびletters
両変数を引数として、search4letters
関数を呼び出しています。結果、当該search4letters
関数の戻り値は、POST
リクエストの結果としてWebアプリケーションからWebブラウザに返されることとなるわけです。
実際にPOSTリクエストを行ってみる
WindowsでHTTPのPOST
リクエストを直接投げるためには、curl.exeを用いるのが手っ取り早い方法です。
- Windows 10 Ver.1803以降であれば、curl.exeは標準で付属している
- cmd.exeやPowerShellといったターミナルから使うことができる
-X POST
というオプション指定で、POST
リクエストを投げるようにする- HTMLフォーム形式のパラメータをリクエストに含めたい場合は、
-F 'パラメータ名=パラメータ値'
というオプションを付ける- 複数のパラメータをリクエストに含めたい場合は、
-F
オプションを必要な数だけ列挙する
- 複数のパラメータをリクエストに含めたい場合は、
事前に対象となるWebアプリケーションを起動した上で、http://127.0.0.1:5000/search4
にphrase
パラメータとletters
パラメータを含むPOST
リクエストを送出するコマンドを送出してみます。実行結果は、例えば以下のようになります。
PS C:\webapp> curl.exe -X POST -F 'phrase=hogehoge' -F 'letters=aeiou' http://127.0.0.1:5000/search4 {'o', 'e'}