Pythonで簡単なWebサーバを立てる

公開 | 更新 
図2.Raspberry Pi内の画像閲覧例

以前、Googleドライブへ静止画像を定期送信するように組んだRaspberry Pi 定点カメラで、画角調整時にブラウザから直接Raspberry Pi 内の撮影画像を閲覧出来るよう、 Python で簡素な Webサーバ を立ててみました。

SimpleHTTPServer/http.serverをモジュール起動するだけ

Pythonには簡易Webサーバが標準ライブラリとして用意されているので、何も追加インストールすることなく、Pythonスクリプト内でインポートして使ったり、以下の要領でPython起動時にモジュールとして呼び出して使うことが出来ます。

※ドキュメントにも明記されているように、あくまで開発時のデバッグ用などの用途に限定するのが、セキュリティ上好ましいとされています。

ポート番号は省略するとデフォルトで8000番が使われますが、それ以外にしたい場合はどちらのモジュールでもポート番号を続けて記述するだけ。他、ネットワークインターフェイスを指定することも可能ですが、詳細は省きます。

一方で気になったのは公開するルートディレクトリを指定する方法で、次のように -d オプションで指定出来るのは、このオプションが実装されたPython 3.7以降に限られます(以下は /tmp 以下を公開する例)。

図1.Python3.7 http.server実行例

図1.Python3.7 http.server実行例

このオプションが使えない場合では、コマンド実行時のパスがそのまま公開フォルダルートと言う仕様なので、実行前に予め移動しておかなければなりません。

Ctrl-C で終了させると、当然のことながら現在のディレクトリは実行前の場所から移動したままになるので、これが時に不便に思うことがあります。

 

pushd〜popdで挟めば元の場所へ戻れる

このような場合に、元いた場所をスタックに保存してから移動し( pushd )、実行後はスタックからパスを読み出して移動( popd )するのが便利です。

このコマンドはLinuxのみならずmacOSやMS-DOSにもあるのですが、全く知りませんでした。

さらに、 pushd では複数のディレクトリを記憶出来ますが、直前のみで良い場合は、 cd - でも戻れますが、こちらはLinuxとmacOSに限定されます。

 

定点カメラの稼働するRaspberry Piへ実装

PythonのWebサーバの仕様を一通り確認したので、実際に定点カメラが稼働しているRaspberry Piで実行してみます。

実はこの端末はFlightAwareのPiAwareをベースとしていることもあり、現在インストールされているPythonのバージョンも変えたく無いという思いから、ここまでしつこく事前検証していました。

図2.Raspberry Pi内の画像閲覧例

図2.Raspberry Pi内の画像閲覧例

これにより、実機の横でスマートフォンのブラウザから容易に定点カメラの画角をチェック出来るようになりました。

 

2023年11月追記:systemdでデーモン化

この定点カメラの撮影した画像をHome Assistant(関連記事はこちら)から参照したくなったので、Python Web Serverをsystemdでデーモン化することにしました。

記述したserviceファイルは次の通り。 WorkingDirectory パラメータを利用して、Webに公開したい /tmp へ移動するので、上述の pushdpopd は不要です。

非力な初代Raspberry Piで常時稼働させるに際して気にしていた点は2つ。

まず、コマンドラインで動かしていた際、アクセスログが標準出力されていましたが、デーモン化したプロセスではシステムログに書き出されることもなく一安心(SDカードへのI/O低減)。

もう1つはCPUやメモリリソースの消費です。シングルコアの初代Raspberry Piなので特にCPU負荷が気がかりでしたが、 top でしばらく見守っていても、CPUは 0% のまま、メモリ消費も 3.5% なので動かし続けても問題はなさそう。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA