21.22. http.server — HTTPサーバー—Pythonドキュメント
21.22。 http.server —HTTPサーバー
ソースコード: :source: `Lib / http / server.py`
このモジュールは、HTTPサーバー(Webサーバー)を実装するためのクラスを定義します。
1つのクラス HTTPServer は、 socketserver.TCPServer サブクラスです。 HTTPソケットを作成してリッスンし、ハンドラーにリクエストをディスパッチします。 サーバーを作成して実行するためのコードは次のようになります。
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
- class http.server.HTTPServer(server_address, RequestHandlerClass)
- このクラスは、サーバーアドレスを
server_name
およびserver_port
という名前のインスタンス変数として格納することにより、 TCPServer クラスに基づいて構築されます。 サーバーには、ハンドラーから、通常はハンドラーのserver
インスタンス変数を介してアクセスできます。
HTTPServer には、インスタンス化時に RequestHandlerClass を指定する必要があります。このモジュールでは、次の3つのバリエーションが提供されます。
- class http.server.BaseHTTPRequestHandler(request, client_address, server)
このクラスは、サーバーに到着するHTTP要求を処理するために使用されます。 それ自体では、実際のHTTP要求に応答することはできません。 各リクエストメソッドを処理するには、サブクラス化する必要があります(例: GETまたはPOST)。 BaseHTTPRequestHandler は、いくつかのクラス変数とインスタンス変数、およびサブクラスで使用するメソッドを提供します。
ハンドラーはリクエストとヘッダーを解析してから、リクエストタイプに固有のメソッドを呼び出します。 メソッド名はリクエストから作成されます。 たとえば、リクエストメソッド
SPAM
の場合、do_SPAM()
メソッドは引数なしで呼び出されます。 関連するすべての情報は、ハンドラーのインスタンス変数に格納されます。 サブクラスは、__init__()
メソッドをオーバーライドまたは拡張する必要はありません。BaseHTTPRequestHandler には、次のインスタンス変数があります。
- client_address
クライアントのアドレスを参照する
(host, port)
の形式のタプルが含まれています。
- server
サーバーインスタンスが含まれます。
- close_connection
handle_one_request()が戻る前に設定する必要があるブール値。別の要求が予想されるかどうか、または接続をシャットダウンする必要があるかどうかを示します。
- requestline
HTTPリクエスト行の文字列表現が含まれます。 終了するCRLFが削除されます。 この属性は、 handle_one_request()で設定する必要があります。 有効な要求行が処理されなかった場合は、空の文字列に設定する必要があります。
- command
コマンド(要求タイプ)が含まれています。 たとえば、
'GET'
です。
- path
リクエストパスが含まれます。
- request_version
リクエストのバージョン文字列が含まれます。 たとえば、
'HTTP/1.0'
です。
- headers
MessageClass クラス変数で指定されたクラスのインスタンスを保持します。 このインスタンスは、HTTPリクエストのヘッダーを解析して管理します。 http.client の
parse_headers()
関数はヘッダーの解析に使用され、HTTPリクエストが有効な RFC 2822 スタイルのヘッダーを提供する必要があります。
- rfile
io.BufferedIOBase 入力ストリーム。オプションの入力データの先頭から、すぐに読み取ることができます。
- wfile
クライアントに応答を書き戻すための出力ストリームが含まれます。 HTTPクライアントとの相互運用を成功させるには、このストリームに書き込むときにHTTPプロトコルを適切に順守する必要があります。
バージョン3.6で変更:これは io.BufferedIOBase ストリームです。
BaseHTTPRequestHandler には次の属性があります。
- server_version
サーバーソフトウェアのバージョンを指定します。 これをオーバーライドすることをお勧めします。 形式は、空白で区切られた複数の文字列であり、各文字列の形式はname [/ version]です。 たとえば、
'BaseHTTP/0.2'
です。
- sys_version
version_string メソッドおよび server_version クラス変数で使用できる形式のPythonシステムバージョンが含まれています。 たとえば、
'Python/1.4'
です。
- error_message_format
クライアントへのエラー応答を作成するために send_error()メソッドで使用する必要があるフォーマット文字列を指定します。 文字列には、 send_error()に渡されたステータスコードに基づいて、 response からの変数がデフォルトで入力されます。
- error_content_type
クライアントに送信されるエラー応答のContent-TypeHTTPヘッダーを指定します。 デフォルト値は
'text/html'
です。
- protocol_version
これは、応答で使用されるHTTPプロトコルのバージョンを指定します。
'HTTP/1.1'
に設定すると、サーバーはHTTP持続的接続を許可します。 ただし、サーバーは、クライアントへのすべての応答に正確なContent-Length
ヘッダー( send_header()を使用)を含める必要があります。 下位互換性のために、設定はデフォルトで'HTTP/1.0'
になっています。
- MessageClass
email.message.Message のようなクラスを指定してHTTPヘッダーを解析します。 通常、これは上書きされず、デフォルトで
http.client.HTTPMessage
になります。
- responses
この属性には、短いメッセージと長いメッセージを含む2要素タプルへのエラーコード整数のマッピングが含まれます。 たとえば、
{code: (shortmessage, longmessage)}
です。 shortmessage は通常、エラー応答の message キーとして使用され、 longmessage は explain キーとして使用されます。 send_response_only()および send_error()メソッドで使用されます。
BaseHTTPRequestHandler インスタンスには次のメソッドがあります。
- handle()
handle_one_request()を1回(または持続的接続が有効になっている場合は複数回)呼び出して、着信HTTPリクエストを処理します。 オーバーライドする必要はありません。 代わりに、適切な
do_*()
メソッドを実装してください。
- handle_one_request()
このメソッドは、リクエストを解析して適切な
do_*()
メソッドにディスパッチします。 オーバーライドする必要はありません。
- handle_expect_100()
HTTP /1.1準拠のサーバーが
Expect: 100-continue
要求ヘッダーを受信すると、100 Continue
の後に200 OK
ヘッダーが続きます。 サーバーがクライアントの続行を望まない場合は、このメソッドをオーバーライドしてエラーを発生させることができます。 例えば サーバーは、応答ヘッダーとして417 Expectation Failed
を送信し、return False
を送信することを選択できます。バージョン3.2の新機能。
- send_error(code, message=None, explain=None)
完全なエラー応答をクライアントに送信してログに記録します。 数値の code は、HTTPエラーコードを指定します。 message は、オプションの、人間が読める形式のエラーの説明です。 Explain 引数を使用して、エラーに関するより詳細な情報を提供できます。 error_message_format 属性を使用してフォーマットされ、ヘッダーの完全なセットの後に応答本文として発行されます。 response 属性は、値が指定されていない場合に使用される message および explain のデフォルト値を保持します。 不明なコードの場合、両方のデフォルト値は文字列
???
です。 メソッドがHEADの場合、または応答コードが1xx
、204 No Content
、205 Reset Content
、304 Not Modified
のいずれかである場合、本文は空になります。バージョン3.4で変更:エラー応答にContent-Lengthヘッダーが含まれています。 Explain 引数を追加しました。
- send_response(code, message=None)
応答ヘッダーをヘッダーバッファーに追加し、受け入れられた要求をログに記録します。 HTTP応答行は内部バッファーに書き込まれ、その後に Server および Date ヘッダーが続きます。 これら2つのヘッダーの値は、それぞれ version_string()メソッドと date_time_string()メソッドから取得されます。 サーバーが send_header()メソッドを使用して他のヘッダーを送信する予定がない場合は、 send_response()の後に end_headers()呼び出しを行う必要があります。
バージョン3.3で変更:ヘッダーは内部バッファーに格納され、 end_headers()を明示的に呼び出す必要があります。
- send_header(keyword, value)
end_headers()または flush_headers()が呼び出されたときに出力ストリームに書き込まれる内部バッファーにHTTPヘッダーを追加します。 キーワードはヘッダーキーワードを指定し、値はその値を指定する必要があります。 send_header呼び出しが完了した後、操作を完了するために end_headers()を呼び出す必要があることに注意してください。
バージョン3.2で変更:ヘッダーは内部バッファーに格納されます。
- send_response_only(code, message=None)
100 Continue
応答がサーバーからクライアントに送信されるときに使用される、応答ヘッダーのみを送信します。 ヘッダーはバッファリングされず、出力ストリームに直接送信されます。メッセージが指定されていない場合、応答コードに対応するHTTPメッセージが送信されます。バージョン3.2の新機能。
- end_headers()
ヘッダーバッファに空白行(応答のHTTPヘッダーの終わりを示す)を追加し、 flush_headers()を呼び出します。
バージョン3.2で変更:バッファリングされたヘッダーが出力ストリームに書き込まれます。
- flush_headers()
最後に、ヘッダーを出力ストリームに送信し、内部ヘッダーバッファーをフラッシュします。
バージョン3.3の新機能。
- log_request(code='-', size='-')
受け入れられた(成功した)要求をログに記録します。 code は、応答に関連付けられた数値のHTTPコードを指定する必要があります。 応答のサイズが利用可能な場合は、 size パラメーターとして渡す必要があります。
- log_error(...)
リクエストを実行できない場合にエラーをログに記録します。 デフォルトでは、メッセージを log_message()に渡すため、同じ引数( format および追加の値)を取ります。
- log_message(format, ...)
任意のメッセージを
sys.stderr
に記録します。 これは通常、カスタムエラーロギングメカニズムを作成するためにオーバーライドされます。 format 引数は、標準のprintfスタイルのフォーマット文字列であり、 log_message()への追加の引数がフォーマットへの入力として適用されます。 クライアントのIPアドレスと現在の日付と時刻は、ログに記録されるすべてのメッセージの前に付けられます。
- version_string()
サーバーソフトウェアのバージョン文字列を返します。 これは、 server_version 属性と sys_version 属性の組み合わせです。
- date_time_string(timestamp=None)
メッセージヘッダー用にフォーマットされた、 timestamp (
None
または time.time()によって返される形式である必要があります)で指定された日付と時刻を返します。 タイムスタンプを省略すると、現在の日付と時刻が使用されます。結果は
'Sun, 06 Nov 1994 08:49:37 GMT'
のようになります。
- log_date_time_string()
ロギング用にフォーマットされた現在の日付と時刻を返します。
- address_string()
クライアントアドレスを返します。
バージョン3.3で変更:以前は、名前のルックアップが実行されていました。 名前解決の遅延を回避するために、常にIPアドレスを返すようになりました。
- class http.server.SimpleHTTPRequestHandler(request, client_address, server)
このクラスは、現在のディレクトリ以下のファイルを提供し、ディレクトリ構造をHTTPリクエストに直接マッピングします。
リクエストの解析など、多くの作業は基本クラス 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
エラー応答を返します。リクエストがファイルにマップされている場合は、リクエストが開かれ、内容が返されます。 要求されたファイルを開く際の OSError 例外は、
404
、'File not found'
エラーにマップされます。 それ以外の場合、コンテンツタイプは、guess_type()
メソッドを呼び出すことによって推測されます。このメソッドは、 extensions_map 変数を使用します。推測されたコンテンツタイプの
'Content-type:'
ヘッダーが出力され、続いてファイルのサイズの'Content-Length:'
ヘッダー、ファイルの変更時刻の'Last-Modified:'
ヘッダーが出力されます。次に、ヘッダーの終わりを示す空白行が続き、ファイルの内容が出力されます。 ファイルのMIMEタイプが
text/
で始まる場合、ファイルはテキストモードで開かれます。 それ以外の場合は、バイナリモードが使用されます。使用例については、 http.server モジュールの test()関数呼び出しの実装を参照してください。
SimpleHTTPRequestHandler クラスは、現在のディレクトリに関連する非常に基本的なWebサーバーサービスファイルを作成するために、次の方法で使用できます。
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
http.server は、port number
引数を指定したインタープリターの -m スイッチを使用して直接呼び出すこともできます。 前の例と同様に、これは現在のディレクトリに関連するファイルを提供します。
python -m http.server 8000
デフォルトでは、サーバーはそれ自体をすべてのインターフェースにバインドします。 オプション-b/--bind
は、バインドする特定のアドレスを指定します。 たとえば、次のコマンドを実行すると、サーバーはローカルホストにのみバインドされます。
python -m http.server 8000 --bind 127.0.0.1
バージョン3.4の新機能: --bind
引数が導入されました。
- class http.server.CGIHTTPRequestHandler(request, client_address, server)
このクラスは、現在のディレクトリ以下のCGIスクリプトのファイルまたは出力を提供するために使用されます。 HTTP階層構造をローカルディレクトリ構造にマッピングすることは、 SimpleHTTPRequestHandler とまったく同じであることに注意してください。
ノート
CGIHTTPRequestHandler クラスによって実行されるCGIスクリプトは、CGIスクリプトの実行前にコード200(スクリプト出力が続く)が送信されるため、リダイレクト(HTTPコード302)を実行できません。 これにより、ステータスコードが横取りされます。
ただし、クラスがCGIスクリプトであると推測した場合、クラスはファイルとして提供するのではなく、CGIスクリプトを実行します。 ディレクトリベースのCGIのみが使用されます—他の一般的なサーバー構成は、特別な拡張機能をCGIスクリプトを示すものとして扱うことです。
do_GET()
およびdo_HEAD()
関数は、要求がcgi_directories
パスの下のどこかにある場合、ファイルを提供する代わりに、CGIスクリプトを実行して出力を提供するように変更されています。CGIHTTPRequestHandler は、次のデータメンバーを定義します。
- cgi_directories
これはデフォルトで
['/cgi-bin', '/htbin']
に設定され、CGIスクリプトを含むものとして扱うディレクトリを記述します。
CGIHTTPRequestHandler は、次のメソッドを定義します。
- do_POST()
このメソッドは
'POST'
リクエストタイプを提供し、CGIスクリプトでのみ許可されます。 非CGIURLにPOSTしようとすると、エラー501「CGIスクリプトにのみPOSTできます」が出力されます。
セキュリティ上の理由から、CGIスクリプトはユーザーnobodyのUIDで実行されることに注意してください。 CGIスクリプトの問題は、エラー403に変換されます。
CGIHTTPRequestHandler は、--cgi
オプションを渡すことにより、コマンドラインで有効にできます。
python -m http.server --cgi 8000