python3のhttp.server を使用すると簡単にhttpサーバを立ち上げる事が出来ます。カスタマイズ出来る軽いサーバとしてかなり重宝しています。
プログラムを書く前に
SSHとSambaを使えばプログラムの編集をデスクトップで実行をRaspberry Piで行う事が出来ます。Raspberry Piのみで開発するより開発の効率が上がります。この環境ではPi 3 model Bに電源を入れるだけで開発が出来ます。

サーバの立ち上げ
先ずは、アクセスすると”Hello HTTP”と表示するサーバを立ち上げます。プログラムは非常に簡単です。
hello.py
from http.server import HTTPServer, SimpleHTTPRequestHandler
class MyHandler(SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', "text/html")
self.end_headers()
self.wfile.write("<h1>Hello HTTP!</h1> \n".encode())
host = ''
port = 8080
httpd = HTTPServer((host, port), MyHandler)
print('serving at port', port)
httpd.serve_forever()
- 1行目: from http.server import HTTPServer, SimpleHTTPRequestHandler
- HTTPServer :サーバ本体のモジュール
- SimpleHTTPRequestHandler: GETやPOST等コマンド関係のモジュール
- 3行目: class MyHandler(SimpleHTTPRequestHandler):
- SimpleHTTPRequestHandlerクラスを基底にした新しいクラスの宣言
- ここで、クライアントからの要求を処理。
- 5行目: def do_GET(self):
- クライアントから、”GET”要求が有った場合、この関数が実行される。
- 7行目: クライアントに、”GET”要求を受けた事を返答。
- 8行目: これから送るデータは、”HTML”形式
- 9行目: 先ずはヘッダーをクライアントに送信
- 10行目: ”<h1> Hello HTTP!</h1> \n”をクライアントに送信し送信完了。
- 14行目: HTTPServer()関数の引数は、server_addressと RequestHandlerClassです。
- server_address: host(文字列)と port(数字) からなるタプル型変数
- host: サーバーがリッスンするアドレス
- 12行目: hostに ”(空文字列)を指定するとすべての利用可能なインターフェースを
意味します。
- 12行目: hostに ”(空文字列)を指定するとすべての利用可能なインターフェースを
- port: 通信に使うポート番号。
- 13行目: 今回は8080を指定
- host: サーバーがリッスンするアドレス
- RequestHandlerClass: リクエストの処理。 MyHandlerを指定しています。
- server_address: host(文字列)と port(数字) からなるタプル型変数
- 15行目: これで、サーバが無限ループ。
プログラムは、”hello.py” と保存して下さい。SSHで同じディレクトリに移動し、$ sudo python3 hello.py と実行して下さい。これでサーバが立ち上がります。

ブラウザからアクセス
ホスト名”raspberrypi”でOSをインストールしているので、ブラウザにURL欄に”raspberrypi.local:8080″と入力すると”Hello HTTP!”と表示されます。また、Raspberry Piからアクセスする場合は”localhost:8080″と入力しても同じ結果になります。
- ブラウザのURL欄に ”raspberrypi.local:8080″ と入力
- Raspberry Piからアクセスする場合: ”localhost:8080″と入力

今回の環境ではルーターのDNS機能によりraspberry pi立ち上げ時自動でIPアドレスが割り当てられます。HTTPServer()関数の引数hostに ”(空文字列)を指定すると自動で割り当てられたIPアドレスがサーバにものと判断されプログラムが実行されます。つまりDNSでサーバのIPアドレスが自動で割り当てられる時にはhostに ”(空文字列)を、固定IPの時にはそのIPアドレスを(‘192.168.1.3’等)指定します。
簡単に動作の説明をすると以下の通り
- ブラウザのURL欄に、”raspberrypi.local:8080″または、”localhost:8080″を入力するとサーバにGETリクエストが送信。
- GETリクエストを受けたサーバは、 do_GET(self)を実行します。
- do_GET(self)では、クライアントに
- GETリクエストを受けた事をself.send_response(200)で返し、
- ”Hello HTTP!”を送信
- do_GET(self)では、クライアントに
- 送信後サーバはクライアントからのリクエスト待ループに入る。
- サーバからのデータを受けたクライアントのブラウザの画面には、”Hello HTTP!”が表示される。
HTTPサーバはSSHの画面で、”Ctrl+C” を押せば停止します。

次回は、HTMLをファイルに保存して、”index.html”をクライアントに送ってみようと思います。