Pythonコマンドで、http.serverモジュールを使ってコマンドライン上から簡易的なウェブサーバを起動する方法について説明しています。
※ 本ページはプロモーションが含まれています。
Pythonは、コマンドライン上でローカル環境のWebサーバを起動する事ができます(http.serverモジュールを使用)。
コマンド1つで簡単にウェブサーバを起動する事ができるので、何かHTTP通信のテストをしたい時などに非常に便利です。
ここでは、その方法と実際に試した事について書いています。
■動作環境とバージョン情報です。
OS:macOS Big Sur(バージョン11.4)
Pythonバージョン:3.9.0
$ python -V
Python 3.9.0
まずは、実際にpythonコマンドでウェブサーバを起動してみます。
$ python -m http.server 8888
Serving HTTP on :: port 8888 (http://[::]:8888/) ...
pythonコマンドは、-mオプションでモジュールを指定できるので"http.server"を指定します。
その後の、8888はポート番号の指定です。上のコマンドでは適当に8888を指定していますが、8888という数字に特に意味はないです。また、ポート番号を指定しないと、デフォルトで8000を使うようになっています。
これで、ウェブサーバが起動できたので、実際にブラウザを使ってアクセスしてみます。
アクセスするURLは、http://localhost:8888 か、http://127.0.0.1:8888です。
ドキュメントルートは、コマンドを実行したディレクトリになります。
ドキュメントルートにindex.htmlファイルがあれば、それがブラウザに表示されると思いますが、なければドキュメントルートにあるディレクトリやファイルの一覧が表示されます。
アクセスした時のサーバ側(コマンドライン側)のログは、HTTPステータスコードの200や404を返してくれます。
::ffff:127.0.0.1 - - [23/Jun/2021 23:50:08] "GET / HTTP/1.1" 200 -
::ffff:127.0.0.1 - - [23/Jun/2021 23:50:21] code 404, message File not found
::ffff:127.0.0.1 - - [23/Jun/2021 23:50:21] "GET /hogehoge.thml HTTP/1.1" 404 -
また、ドキュメントルートのディレクトリを指定したい場合は、-dオプションでできます。
$ python -m http.server 8888 -d testdir
Serving HTTP on :: port 8888 (http://[::]:8888/) ...
ウェブサーバを終了したい場合、コマンドライン側でショートカット"Ctrl + C"で終了できます。
$ python -m http.server 8888
Serving HTTP on :: port 8888 (http://[::]:8888/) ...
^C
Keyboard interrupt received, exiting.
このウェブサーバですが、HTTPのPOSTには対応していないようです。
curlでPOSTリクエストをしてみましたが、ステータスコード501を返してきました(501はNot Implemented、実装されていないメソッドを使用したという意味です)。
$ curl -v -X POST http://127.0.0.1:8888 -d "key1=value1"
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8888 (#0)
> POST / HTTP/1.1
> Host: 127.0.0.1:8888
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Length: 11
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 11 out of 11 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 501 Unsupported method ('POST')
< Server: SimpleHTTP/0.6 Python/3.9.0
〜
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code: 501</p>
<p>Message: Unsupported method ('POST').</p>
<p>Error code explanation: HTTPStatus.NOT_IMPLEMENTED - Server does not support this operation.</p>
</body>
</html>
サーバサイドのログも、501と出ています。
$ python -m http.server 8888
Serving HTTP on :: port 8888 (http://[::]:8888/) ...
::ffff:127.0.0.1 - - [24/Jun/2021 01:46:56] code 501, message Unsupported method ('POST')
::ffff:127.0.0.1 - - [24/Jun/2021 01:46:56] "POST / HTTP/1.1" 501 -