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

注釈

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

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

参考

Module BaseHTTPServer

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