Python
server

動作確認用ウェブサーバを一瞬で立てる

python の SimpleHTTPServer モジュールを使って動作確認用の簡易ウェブサーバを立てる方法のまとめです。

使い所

例えば index.html が

<link href="/css/style.css" rel="stylesheet" type="text/css">

と絶対パスで css や javascript を読み込んでいるとします。

このときブラウザで file:///Users/username/.../index.html を表示すると、ブラウザは file:///css/style.css にアクセスを試み、見つけられずに表示崩れなどが起こります。
簡易ウェブサーバを立てて http://localhost:8000/index.html としてテストを行うと、 css のパスは http://localhost:8000/css/style.css となり、正常に読み込むことができます。

CGI が動く簡易ウェブサーバを立てることもできるので、CGIの開発がはかどります。

簡易HTTPサーバ

以下のコマンドをシェルに打ち込むと簡易ウェブサーバが立ちます。
python2 と python3 でモジュールが異なるところがやや落とし穴です。

python2:

python -m SimpleHTTPServer

python3:

python -m http.server

上記のコマンドで、手元の 8000 番ポートで待ち受ける HTTP サーバが起動し、起動したシェルのカレントディレクトリ以下が公開されます。
http://localhost:8000/ にアクセスすると index.html の内容、またはディレクトリのファイル一覧が表示されるかと思います。

なおコマンドライン引数にポート番号を与えると、待ち受けポートを変更することができます。

$ python -m SimpleHTTPServer 1234
Serving HTTP on 0.0.0.0 port 1234 ...

簡易CGIサーバ

たまに CGI を触ろうと思うとどうやって動かしたものか迷うのですが、これも CGIHttpServer モジュールを使うことで簡単に動作確認できます。

ディレクトリ構造:

.
├── cgi-bin
│   └── hello
└── index.html

hello:(chmod +x hello として実行権限を付けます)

#!/usr/bin/env bash

cat << __EOF__
Content-Type: text/html;charset=utf-8

<h1>CGI Works!</h1>
__EOF__

python2:

python -m CGIHTTPServer

CGI サーバも python2 と python3 で起動方法が異なります。

python3:

python -m http.server --cgi           

これで http://localhost:8000/cgi-bin/hello にアクセスすると CGI が実行されます。

公開範囲を限定する

python3 の http.server モジュールでは公開範囲を限定するオプションが存在します。

前述のコマンドで立てたウェブサーバはすべてのネットワークインターフェースで待ち受けるため、 localhost 以外からでもアクセスできます。
例えば自分のローカル IP アドレスが 192.168.10.a の時、同一 LAN 内に存在しているすべてのホスト 192.168.10.* に対して、起動したシェルのカレントディレクトリ以下のファイルを公開していることになります。

※この方法は同一 LAN 内の別のパソコンにファイルを渡す簡単な方法としても使えますが、経路上をファイルが平文で流れるので、セキュリティ的に第三者に見られてはだめなファイルがカレントディレクトリ以下にあるときには使えないです。

さて、動作確認用にウェブサーバを立てる時には、自分以外の誰かが見たり実行したりすることは想定していないはずです。
次のようにすれば公開範囲を限定することができます。

$ python -m http.server --bind localhost
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...

bind オプションに待ち受けアドレスを書くことで、 http://localhost:8000/http://127.0.0.1:8000/ ではアクセスできるけれども、 http://192.168.10.a:8000/ ではアクセスできない状態になります。