20.18. BaseHTTPServer —基本的なHTTPサーバー—Pythonドキュメント
20.18。 BaseHTTPServer —基本的なHTTPサーバー
ノート
BaseHTTPServer モジュールは、Python3のhttp.server
に統合されました。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。
ソースコード: :source: `Lib / BaseHTTPServer.py`
このモジュールは、HTTPサーバー(Webサーバー)を実装するための2つのクラスを定義します。 通常、このモジュールは直接使用されませんが、機能するWebサーバーを構築するための基礎として使用されます。 SimpleHTTPServer および CGIHTTPServer モジュールを参照してください。
最初のクラス HTTPServer は、 SocketServer.TCPServer サブクラスであるため、 SocketServer.BaseServer インターフェイスを実装します。 HTTPソケットを作成してリッスンし、ハンドラーにリクエストをディスパッチします。 サーバーを作成して実行するためのコードは次のようになります。
def run(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
- class BaseHTTPServer.HTTPServer(server_address, RequestHandlerClass)
- このクラスは、サーバーアドレスを
server_name
およびserver_port
という名前のインスタンス変数として格納することにより、TCPServer
クラスに基づいて構築されています。 サーバーには、ハンドラーから、通常はハンドラーのserver
インスタンス変数を介してアクセスできます。
- class BaseHTTPServer.BaseHTTPRequestHandler(request, client_address, server)
このクラスは、サーバーに到着するHTTP要求を処理するために使用されます。 それ自体では、実際のHTTP要求に応答することはできません。 各リクエストメソッドを処理するには、サブクラス化する必要があります(例: GETまたはPOST)。 BaseHTTPRequestHandler は、いくつかのクラス変数とインスタンス変数、およびサブクラスで使用するメソッドを提供します。
ハンドラーはリクエストとヘッダーを解析してから、リクエストタイプに固有のメソッドを呼び出します。 メソッド名はリクエストから作成されます。 たとえば、リクエストメソッド
SPAM
の場合、do_SPAM()
メソッドは引数なしで呼び出されます。 関連するすべての情報は、ハンドラーのインスタンス変数に格納されます。 サブクラスは、__init__()
メソッドをオーバーライドまたは拡張する必要はありません。BaseHTTPRequestHandler には、次のインスタンス変数があります。
- client_address
クライアントのアドレスを参照する
(host, port)
の形式のタプルが含まれています。
- server
サーバーインスタンスが含まれます。
- command
コマンド(要求タイプ)が含まれています。 たとえば、
'GET'
です。
- path
リクエストパスが含まれます。
- request_version
リクエストのバージョン文字列が含まれます。 たとえば、
'HTTP/1.0'
です。
- headers
MessageClass クラス変数で指定されたクラスのインスタンスを保持します。 このインスタンスは、HTTPリクエストのヘッダーを解析して管理します。
- rfile
オプションの入力データの先頭に配置された入力ストリームが含まれます。
- wfile
クライアントに応答を書き戻すための出力ストリームが含まれます。 このストリームに書き込むときは、HTTPプロトコルを適切に順守する必要があります。
BaseHTTPRequestHandler には、次のクラス変数があります。
- server_version
サーバーソフトウェアのバージョンを指定します。 これをオーバーライドすることをお勧めします。 形式は、空白で区切られた複数の文字列であり、各文字列の形式はname [/ version]です。 たとえば、
'BaseHTTP/0.2'
です。
- sys_version
version_string メソッドおよび server_version クラス変数で使用できる形式のPythonシステムバージョンが含まれています。 たとえば、
'Python/1.4'
です。
- error_message_format
クライアントへのエラー応答を作成するためのフォーマット文字列を指定します。 括弧で囲まれたキー付きフォーマット指定子を使用するため、フォーマットオペランドはディクショナリである必要があります。 code キーは整数で、HTTPエラーコードの数値を指定する必要があります。 message は、発生した内容の(詳細な)エラーメッセージを含む文字列である必要があり、 Explain は、エラーコード番号の説明である必要があります。 デフォルトの message および explain 値は、 response クラス変数にあります。
- error_content_type
クライアントに送信されるエラー応答のContent-TypeHTTPヘッダーを指定します。 デフォルト値は
'text/html'
です。バージョン2.6の新機能:以前は、コンテンツタイプは常に
'text/html'
でした。
- protocol_version
これは、応答で使用されるHTTPプロトコルのバージョンを指定します。
'HTTP/1.1'
に設定すると、サーバーはHTTP持続的接続を許可します。 ただし、サーバーは、クライアントへのすべての応答に正確なContent-Length
ヘッダー( send_header()を使用)を含める必要があります。 下位互換性のために、設定はデフォルトで'HTTP/1.0'
になっています。
- MessageClass
rfc822.Message のようなクラスを指定してHTTPヘッダーを解析します。 通常、これは上書きされず、デフォルトで mimetools.Message になります。
- responses
この変数には、エラーコード整数から短いメッセージと長いメッセージを含む2要素タプルへのマッピングが含まれています。 たとえば、
{code: (shortmessage, longmessage)}
です。 shortmessage は通常、エラー応答の message キーとして使用され、 longmessage は explain キーとして使用されます(を参照)。 error_message_format クラス変数)。
BaseHTTPRequestHandler インスタンスには次のメソッドがあります。
- handle()
handle_one_request()を1回(または持続的接続が有効になっている場合は複数回)呼び出して、着信HTTPリクエストを処理します。 オーバーライドする必要はありません。 代わりに、適切な
do_*()
メソッドを実装してください。
- handle_one_request()
このメソッドは、リクエストを解析して適切な
do_*()
メソッドにディスパッチします。 オーバーライドする必要はありません。
- send_error(code[, message])
完全なエラー応答をクライアントに送信してログに記録します。 数値のコードはHTTPエラーコードを指定し、メッセージはオプションのより具体的なテキストです。 ヘッダーの完全なセットが送信され、その後に error_message_format クラス変数を使用して作成されたテキストが続きます。 メソッドがHEADの場合、または応答コードが
1xx
、204 No Content
、205 Reset Content
、304 Not Modified
のいずれかである場合、本文は空になります。
- send_response(code[, message])
応答ヘッダーを送信し、受け入れられた要求をログに記録します。 HTTP応答行が送信され、その後に Server および Date ヘッダーが続きます。 これら2つのヘッダーの値は、それぞれ version_string()メソッドと date_time_string()メソッドから取得されます。
- send_header(keyword, value)
特定のHTTPヘッダーを出力ストリームに書き込みます。 キーワードはヘッダーキーワードを指定し、値はその値を指定する必要があります。
- end_headers()
応答のHTTPヘッダーの終わりを示す空白行を送信します。
- 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])
timestamp ( time.time()によって返される形式である必要があります)で指定された日付と時刻を、メッセージヘッダー用にフォーマットして返します。 タイムスタンプを省略すると、現在の日付と時刻が使用されます。
結果は
'Sun, 06 Nov 1994 08:49:37 GMT'
のようになります。バージョン2.5の新機能: タイムスタンプパラメーター。
- log_date_time_string()
ロギング用にフォーマットされた現在の日付と時刻を返します。
- address_string()
ロギング用にフォーマットされたクライアントアドレスを返します。 名前のルックアップは、クライアントのIPアドレスで実行されます。
20.18.1。 その他の例
永久に実行されないが、何らかの条件が満たされるまで実行されるサーバーを作成するには、次のようにします。
def run_while_true(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
"""
This assumes that keep_running() is a function of no arguments which
is tested initially and after each request. If its return value
is true, the server continues.
"""
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
while keep_running():
httpd.handle_request()
も参照してください
- モジュール CGIHTTPServer
- CGIスクリプトをサポートする拡張リクエストハンドラ。
- モジュール SimpleHTTPServer
- 実際にドキュメントルートの下にあるファイルへの応答を制限する基本的なリクエストハンドラ。