# 20.19. `SimpleHTTPServer` --- 簡潔な HTTP リクエストハンドラ

注釈

`SimpleHTTPServer` モジュールは、Python 3では `http.server` モジュールに統合されました。 2to3 ツールが自動的にソースコード内の import を修正します。

警告

mod:SimpleHTTServer is not recommended for production. It only implements basic security checks.

`SimpleHTTPServer` モジュールは、 `SimpleHTTPRequestHandler` クラス 1 つを提供しています。このクラスは、 `BaseHTTPServer.BaseHTTPRequestHandler` に対して互換性のあるインタフェースを持っています。

`SimpleHTTPServer` モジュールは以下のクラスを定義します:

class `SimpleHTTPServer.``SimpleHTTPRequestHandler`(request, client_address, server)

  このクラスは、現在のディレクトリ以下にあるファイルを、HTTP リクエストにおけるディレクトリ構造に直接対応付けて提供します。

  リクエストの解釈のような、多くの作業は基底クラス `BaseHTTPServer.BaseHTTPRequestHandler` で行われます。このクラスは関数 `do_GET()` および `do_HEAD()` を実装しています。

  `SimpleHTTPRequestHandler` では以下のメンバ変数を定義しています:

  `server_version`

  この値は `"SimpleHTTP/" + __version__` になります。`__version__` はこのモジュールで定義されている値です。

  `extensions_map`

    拡張子を MIME 型指定子に対応付ける辞書です。標準の型指定は空文字列で表され、この値は `application/octet-stream` と見なされます。対応付けは大小文字の区別をするので、小文字のキーのみを入れるべきです。

  `SimpleHTTPRequestHandler` では以下のメソッドを定義しています:

  `do_HEAD`()

    このメソッドは `'HEAD'` 型のリクエスト処理を実行します: すなわち、 `GET` リクエストの時に送信されるものと同じヘッダを送信します。送信される可能性のあるヘッダについての完全な説明は `do_GET()` メソッドを参照してください。

  `do_GET`()

    リクエストを現在の作業ディレクトリからの相対的なパスとして解釈することで、リクエストをローカルシステム上のファイルと対応付けます。

    リクエストがディレクトリに対応付けられた場合、 `index.html` または `index.htm` を (この順序で) チェックします。もしファイルを発見できればその内容を、そうでなければディレクトリ一覧を `list_directory()` メソッドで生成して、返します。このメソッドは `os.listdir()` をディレクトリのスキャンに用いており、 `listdir()` が失敗した場合には `404` 応答が返されます。

    リクエストがファイルに対応付けられた場合、そのファイルを開いて内容を返します。要求されたファイルを開く際に何らかの `IOError` 例外が送出された場合、リクエストは `404` 、 `'File not found'` エラーに対応づけられます。そうでない場合、 extensions_map 変数を用いて `guess_type()` メソッドにより content-type が推測されます。

    出力は `'Content-type:'` と推測されたコンテントタイプで、その後にファイルサイズを示す `'Content-Length;'` ヘッダと、ファイルの更新日時を示す `'Last-Modified:'` ヘッダが続きます。

    そしてヘッダの終了を示す空白行が続き、さらにその後にファイルの内容が続きます。このファイルはコンテントタイプが `text/` で始まっている場合はテキストモードで、そうでなければバイナリモードで開かれます。

    `SimpleHTTPServer` モジュールの `test()` 関数は `SimpleHTTPRequestHandler` をハンドラとして使うサーバを作る例になっています。

    バージョン 2.5 で追加: `'Last-Modified'` ヘッダ.

`SimpleHTTPServer` モジュールを使って現在のディレクトリ以下にあるファイルにアクセスできるだけの、非常に初歩的な Web サーバを立ち上げる方法は以下の通りです。

    import SimpleHTTPServer
    import SocketServer

    PORT = 8000

    Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

    httpd = SocketServer.TCPServer(("", PORT), Handler)

    print "serving at port", PORT
    httpd.serve_forever()

インタプリタの `-m` スイッチで `SimpleHTTPServer` モジュールと `ポート番号` を指定して直接実行することもできます。上の例と同じように、ここで立ち上がったサーバは現在のディレクトリ以下のファイルへのアクセスを提供します。

    python -m SimpleHTTPServer 8000

参考

`BaseHTTPServer` モジュール
  Web サーバとリクエスト処理機構を実装した基底クラスです。