20.18. BaseHTTPServer —基本的なHTTPサーバー—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/basehttpserver
移動先:案内検索

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 キーとして使用され、 longmessageexplain キーとして使用されます(を参照)。 error_message_format クラス変数)。

BaseHTTPRequestHandler インスタンスには次のメソッドがあります。

handle()

handle_one_request()を1回(または持続的接続が有効になっている場合は複数回)呼び出して、着信HTTPリクエストを処理します。 オーバーライドする必要はありません。 代わりに、適切なdo_*()メソッドを実装してください。

handle_one_request()

このメソッドは、リクエストを解析して適切なdo_*()メソッドにディスパッチします。 オーバーライドする必要はありません。

send_error(code[, message])

完全なエラー応答をクライアントに送信してログに記録します。 数値のコードはHTTPエラーコードを指定し、メッセージはオプションのより具体的なテキストです。 ヘッダーの完全なセットが送信され、その後に error_message_format クラス変数を使用して作成されたテキストが続きます。 メソッドがHEADの場合、または応答コードが1xx204 No Content205 Reset Content304 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])

timestamptime.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
実際にドキュメントルートの下にあるファイルへの応答を制限する基本的なリクエストハンドラ。