20.19. SimpleHTTPServer --- 簡潔な HTTP リクエストハンドラ¶
注釈
SimpleHTTPServer モジュールは、Python 3では http.server モジュールに統合されました。 2to3 ツールが自動的にソースコード内の import を修正します。
警告
SimpleHTTPServer 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 サーバとリクエスト処理機構を実装した基底クラスです。
