Pythonコマンドで、ローカル環境にWebサーバを起動する

Pythonコマンドで、http.serverモジュールを使ってコマンドライン上から簡易的なウェブサーバを起動する方法について説明しています。

※ 本ページはプロモーションが含まれています。

目的と動作環境

最終更新日:2021/6/29

Pythonは、コマンドライン上でローカル環境のWebサーバを起動する事ができます(http.serverモジュールを使用)。

コマンド1つで簡単にウェブサーバを起動する事ができるので、何かHTTP通信のテストをしたい時などに非常に便利です。
ここでは、その方法と実際に試した事について書いています。

■動作環境とバージョン情報です。
OS:macOS Big Sur(バージョン11.4)
Pythonバージョン:3.9.0

$ python -V
Python 3.9.0

pythonコマンドでウェブサーバを起動

まずは、実際に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です。
Pythonコマンドでウェブサーバ(http.serverモジュール)を起動してブラウザで確認

ドキュメントルートは、コマンドを実行したディレクトリになります。
ドキュメントルートに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 -