序章
http.server
socketserver.TCPServer
HTTP ソケットを作成してリッスンし、リクエストをハンドラーにディスパッチする のサブクラスです。この記事は、 Python モジュールを使用してhttp.server
シンプルな HTTP サーバーをすばやく構築する方法に関するチュートリアルです。
インストール
Python3 の標準モジュールが組み込まれており、インストールする必要はありません。(Python2 の以前のバージョンでは、名前は でしたSimpleHTTPServer
)
チュートリアル
コマンドラインから作成
http.server は、Python インタープリターの -m パラメーターを使用した直接呼び出しをサポートしています。
次のコマンドを実行して、最も単純な HTTP サーバーを作成します。
python -m http.server
サーバーのデフォルトのリスニング ポートは 8000 で、カスタム ポート番号をサポートします。
python -m http.server 9000
-b/--bind
サーバーはデフォルトですべてのインターフェースにバインドされており、 localhost などのアドレスを指定することで指定できます。
python -m http.server --bind 127.0.0.1
サーバーのデフォルトの作業ディレクトリは現在のディレクトリであり、-d/--directory
作業ディレクトリはパラメータを通じて指定できます。
python -m http.server --directory /tmp/
さらに、パラメータを渡すことでCGI--cgi
リクエスト ハンドラを有効にすることができます。
python -m http.server --cgi
作成するコードを書く
http.server はコード内での呼び出しもサポートしており、対応するクラスと関数をインポートするだけです。
from http.server import SimpleHTTPRequestHandler
from http.server import CGIHTTPRequestHandler
from http.server import ThreadingHTTPServer
from functools import partial
import contextlib
import sys
import os
class DualStackServer(ThreadingHTTPServer):
def server_bind(self):
# suppress exception when protocol is IPv4
with contextlib.suppress(Exception):
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
return super().server_bind()
def run(server_class=DualStackServer,
handler_class=SimpleHTTPRequestHandler,
port=8000,
bind='127.0.0.1',
cgi=False,
directory=os.getcwd()):
"""Run an HTTP server on port 8000 (or the port argument).
Args:
server_class (_type_, optional): Class of server. Defaults to DualStackServer.
handler_class (_type_, optional): Class of handler. Defaults to SimpleHTTPRequestHandler.
port (int, optional): Specify alternate port. Defaults to 8000.
bind (str, optional): Specify alternate bind address. Defaults to '127.0.0.1'.
cgi (bool, optional): Run as CGI Server. Defaults to False.
directory (_type_, optional): Specify alternative directory. Defaults to os.getcwd().
"""
if cgi:
handler_class = partial(CGIHTTPRequestHandler, directory=directory)
else:
handler_class = partial(SimpleHTTPRequestHandler, directory=directory)
with server_class((bind, port), handler_class) as httpd:
print(
f"Serving HTTP on {
bind} port {
port} "
f"(http://{
bind}:{
port}/) ..."
)
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
sys.exit(0)
if __name__ == '__main__':
run(port=8000, bind='127.0.0.1')
server_class
: サーバークラスhandler_class
: リクエスト処理クラスport
:ポートbind
:IPcgi
: CGIリクエストハンドラを有効にするかどうかdirectory
:作品一覧
例
http.server で HTTP サーバーをすばやく作成できることがわかりましたが、これはどのようなプロジェクト シナリオに適用できるでしょうか?
- LAN 内の小規模な Web プロジェクトのプレビュー
- プロジェクトディレクトリ
web:.
├─index.html
- インデックス.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
hello world
</body>
</html>
- ディレクトリに切り替えて
cd web
コマンドを実行しpython -m http.server
、ブラウザのアドレス バーに入力してlocalhost:8000
次を表示します。
hello world
LAN 内の他のユーザーは、ホスト IP + ポート番号を通じてアクセスできます。ホスト IP が 192.168.0.1 の場合、URL 192.168.0.1:8000 を同僚やクラスメートに送信すると、インデックスを参照することもできます。 html レンダリングするファイルのコンテンツ。
- ローカルブラウザでリモートサーバーにアクセスするためのポートマッピング
VSCode 経由でリモート サーバーに接続する場合、http.server を使用してポートを開いた後、ポートが自動的にローカルにマッピングされるため、ローカル ブラウザでリモート サーバーのリソースを表示およびダウンロードできます。(VSCode に加えて、他のツールでもリモートおよびローカルのポート マッピングを実装できる必要があります)
知らせ
http.server は最も基本的なセキュリティ レビューのみを実装しているため、運用環境では使用しないでください。