PythonでのHTTPサーバの実装には、BaseHTTPServerを使用する。
まず、プログラム全体を載せる。
メインプログラム
メインプログラムの流れは 図 1 のようになる。
図 1: メインプログラム.
非常に簡単。 このプログラムの肝となるのは、TestHandlerの実装となる。
TestHandlerの実装
TestHandlerのインターフェイスは 図 2 のようになる。
図 2: TestHandlerクラス.
do_GET()の実装
do_GET()の流れは 図 3 のようになる。
図 3: do_GET()の流れ.
do_GET()はサーバに対してGETリクエストを投げられた時にコールバックされる。
path変数にはアクセス先が格納されている。
ui.htmlへアクセスされた場合は、html変数に設定してある内容を返す。 htmlには、このサーバの機能をブラウザから呼び出せるようにするためのページが記述されている。
それ以外のページにアクセスされた場合は404を返す。
do_POST()の実装
do_POST()の流れは 図 4 のようになる。
図 4: do_POST()の流れ.
do_POST()はサーバに対してPOSTリクエストを投げられた時にコールバックされる。
path変数にはアクセス先が格納されている。fromデータはcgi.FieldStorage()で取得する。
ここではstateの値によってLEDを点灯、消灯する。
process_post_haeder()の実装
process_post_haeder()は 図 5 のようになる。
図 5: process_post_header()の流れ.
get_ip_address()について
ui.htmlで返すHTMLのform
actionには、サーバのIPアドレスを設定する必要がある。
しかし、スクリプトが実行されるIPアドレスは実行時までわからないため、@HOST@
という文字列にしておき、
下記のようにget_ip_address()
で取得したIPアドレスで置換している。
html = html.replace('@HOST@', get_ip_address())
get_ip_address()の処理の流れは 図 6 のようになっている。
図 6: get_ip_address()の流れ.
socketを開き、試しに8.8.8.8へ接続を試み、その時に使用されたネットワークインターフェイスのアドレスを取得する。
Ledクラスについて
特に言うこともないので省略する。