Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Python辞典

  1. トップページ
  2. Python辞典
  3. http.server.HTTPServer()

http.server.HTTPServer()

『http.server』はPython標準ライブラリで提供される簡易HTTPサーバーです。外部ライブラリなしでHTTPサーバーを起動でき、開発・テスト・静的ファイルの配信などに利用できます。本番環境での使用は想定されていません。本番にはgunicorn・uvicornなど専用のWSGIサーバーを使いましょう

構文
from http.server import HTTPServer, SimpleHTTPRequestHandler, BaseHTTPRequestHandler

# 静的ファイルサーバー(カレントディレクトリを公開)
server = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
server.serve_forever()

# カスタムリクエストハンドラー
class MyHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello!')
クラス・メソッド一覧
クラス・メソッド概要
HTTPServer((host, port), handler)指定ホスト・ポートでHTTPサーバーを生成する。
server.serve_forever()サーバーを起動して永続的にリクエストを受け付ける。
server.shutdown()serve_forever()を停止する。
SimpleHTTPRequestHandlerカレントディレクトリの静的ファイルを配信するハンドラー。
BaseHTTPRequestHandlerカスタムハンドラーを作るための基底クラス。
handler.do_GET()GETリクエストを処理するメソッド(オーバーライドして実装)。
handler.do_POST()POSTリクエストを処理するメソッド(オーバーライドして実装)。
handler.send_response(code)ステータスコードをレスポンスに書き込む。
handler.send_header(key, val)レスポンスヘッダーを追加する。
handler.end_headers()ヘッダーの終わりを示す空行を送信する。
handler.wfile.write(data)レスポンスボディ(バイト列)を送信する。
handler.rfile.read(length)リクエストボディを読み込む(POSTで使用)。
handler.pathリクエストのパス(クエリ文字列を含む)。
handler.headersリクエストヘッダーの辞書。
サンプルコード
from http.server import HTTPServer, SimpleHTTPRequestHandler, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse
import json
import threading

# コマンドラインから静的ファイルサーバーを起動(Pythonの組み込みコマンド)
# python -m http.server 8000

# スクリプトから静的ファイルサーバーを起動
server = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
print("サーバー起動: http://localhost:8000")
# server.serve_forever()    # カレントディレクトリのファイルを配信

# カスタムHTTPハンドラー
class MyAPIHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)
        path   = parsed.path
        params = parse_qs(parsed.query)

        if path == '/':
            self._send_json({'message': 'こんにちは!', 'status': 'ok'})
        elif path == '/greet':
            name = params.get('name', ['名無しさん'])[0]
            self._send_json({'greeting': f'こんにちは、{name}!'})
        else:
            self._send_json({'error': 'Not Found'}, status=404)

    def do_POST(self):
        # リクエストボディを読み込む
        length = int(self.headers.get('Content-Length', 0))
        body   = self.rfile.read(length)
        try:
            data = json.loads(body.decode('utf-8'))
            self._send_json({'received': data, 'status': 'ok'})
        except json.JSONDecodeError:
            self._send_json({'error': 'Invalid JSON'}, status=400)

    def _send_json(self, data, status=200):
        """JSONレスポンスを送信するヘルパー"""
        body = json.dumps(data, ensure_ascii=False).encode('utf-8')
        self.send_response(status)
        self.send_header('Content-Type', 'application/json; charset=utf-8')
        self.send_header('Content-Length', str(len(body)))
        self.end_headers()
        self.wfile.write(body)

    def log_message(self, format, *args):
        """デフォルトのアクセスログを抑制(必要なら削除)"""
        pass

# バックグラウンドスレッドでサーバーを起動
server = HTTPServer(('localhost', 8080), MyAPIHandler)
thread = threading.Thread(target=server.serve_forever, daemon=True)
thread.start()
print("APIサーバー起動: http://localhost:8080")

# テスト用リクエスト
from urllib import request
with request.urlopen('http://localhost:8080/greet?name=田中') as res:
    print(res.read().decode())  # {"greeting": "こんにちは、田中!"}

server.shutdown()
概要

『SimpleHTTPRequestHandler』はカレントディレクトリ以下のファイルを配信する最もシンプルなサーバーです。コマンドラインから『python -m http.server 8000』を実行するだけで起動でき、簡単なファイル共有やSPAのローカル確認に便利です。

カスタムハンドラーを作る場合は『BaseHTTPRequestHandler』を継承し、do_GET()やdo_POST()などのメソッドを実装します。レスポンスの送信は必ず『send_response()』→『send_header()』(複数回)→『end_headers()』→『wfile.write()』の順で行います。end_headers()を呼ばないと空行が送信されずHTTPプロトコルが正しく機能しません

本格的なWebアプリケーションやAPIサーバーを作る場合はFlask・FastAPIなどのフレームワークを使いましょう。これらはルーティング・テンプレート・認証などの機能が揃っており、生産性が大幅に向上します。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。