http.server — HTTPサーバー—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/http.server
移動先:案内検索

http.server —HTTPサーバー

ソースコード: :source: `Lib / http / server.py`



このモジュールは、HTTPサーバー(Webサーバー)を実装するためのクラスを定義します。

警告

http.server は本番環境には推奨されません。 基本的なセキュリティチェックのみを実装します。


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インスタンス変数を介してアクセスできます。
class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

このクラスはHTTPServerと同じですが、スレッドを使用して ThreadingMixIn を使用してリクエストを処理します。 これは、 HTTPServer が無期限に待機するソケットを事前に開くWebブラウザーを処理するのに役立ちます。

バージョン3.7の新機能。

HTTPServer および ThreadingHTTPServer には、インスタンス化時に 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

リクエストパスが含まれます。 URLのクエリコンポーネントが存在する場合、pathにはクエリが含まれます。 RFC 3986 の用語を使用すると、pathにはhier-partqueryが含まれます。

request_version

リクエストのバージョン文字列が含まれます。 たとえば、'HTTP/1.0'です。

headers

MessageClass クラス変数で指定されたクラスのインスタンスを保持します。 このインスタンスは、HTTPリクエストのヘッダーを解析して管理します。 http.clientparse_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 キーとして使用され、 longmessageexplain キーとして使用されます。 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の場合、または応答コードが1xx204 No Content205 Reset Content304 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)

メッセージヘッダー用にフォーマットされた、 timestampNoneまたは 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, directory=None)

このクラスは、現在のディレクトリ以下のファイルを提供し、ディレクトリ構造をHTTPリクエストに直接マッピングします。

リクエストの解析など、多くの作業は基本クラス BaseHTTPRequestHandler によって行われます。 このクラスは、 do_GET()および do_HEAD()関数を実装します。

以下は、 SimpleHTTPRequestHandler のクラスレベルの属性として定義されています。

server_version

これは"SimpleHTTP/" + __version__になります。ここで、__version__はモジュールレベルで定義されます。

extensions_map

接尾辞をMIMEタイプにマッピングする辞書。 デフォルトは空の文字列で示され、application/octet-streamと見なされます。 マッピングは大文字と小文字を区別せずに使用されるため、小文字のキーのみを含める必要があります。

directory

指定しない場合、提供するディレクトリは現在の作業ディレクトリです。

SimpleHTTPRequestHandler クラスは、次のメソッドを定義します。

do_HEAD()

このメソッドは、'HEAD'リクエストタイプを処理します。同等のGETリクエストに対して送信するヘッダーを送信します。 可能なヘッダーのより完全な説明については、 do_GET()メソッドを参照してください。

do_GET()

要求は、現在の作業ディレクトリからの相対パスとして要求を解釈することにより、ローカルファイルにマップされます。

リクエストがディレクトリにマップされている場合、ディレクトリはindex.htmlまたはindex.htmという名前のファイルを(この順序で)チェックされます。 見つかった場合、ファイルの内容が返されます。 それ以外の場合は、list_directory()メソッドを呼び出してディレクトリリストを生成します。 このメソッドは、 os.listdir()を使用してディレクトリをスキャンし、 listdir()が失敗した場合に404エラー応答を返します。

リクエストがファイルにマップされている場合は、ファイルが開かれます。 要求されたファイルを開く際の OSError 例外は、404'File not found'エラーにマップされます。 リクエストに'If-Modified-Since'ヘッダーがあり、この時間以降にファイルが変更されなかった場合、304'Not Modified'応答が送信されます。 それ以外の場合は、guess_type()メソッドを呼び出してコンテンツタイプを推測します。このメソッドは extensions_map 変数を使用し、ファイルのコンテンツが返されます。

推測されたコンテンツタイプの'Content-type:'ヘッダーが出力され、続いてファイルのサイズの'Content-Length:'ヘッダー、ファイルの変更時刻の'Last-Modified:'ヘッダーが出力されます。

次に、ヘッダーの終わりを示す空白行が続き、ファイルの内容が出力されます。 ファイルのMIMEタイプがtext/で始まる場合、ファイルはテキストモードで開かれます。 それ以外の場合は、バイナリモードが使用されます。

使用例については、 http.server モジュールの test()関数呼び出しの実装を参照してください。

バージョン3.7で変更: 'If-Modified-Since'ヘッダーのサポート。

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は、バインドする特定のアドレスを指定します。 IPv4アドレスとIPv6アドレスの両方がサポートされています。 たとえば、次のコマンドを実行すると、サーバーはローカルホストにのみバインドされます。

python -m http.server 8000 --bind 127.0.0.1

バージョン3.4の新機能: --bind引数が導入されました。


バージョン3.8の新機能: --bind引数がIPv6をサポートするように拡張されました


デフォルトでは、サーバーは現在のディレクトリを使用します。 オプション-d/--directoryは、ファイルを提供するディレクトリを指定します。 たとえば、次のコマンドは特定のディレクトリを使用します。

python -m http.server --directory /tmp/

バージョン3.7の新機能: --directory代替ディレクトリを指定


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