20.4. wsgiref --- WSGI ユーティリティとリファレンス実装¶
バージョン 2.5 で追加.
Web Server Gateway Interface (WSGI) は、Web サーバソフトウェアと Python で記述された Web アプリケーションとの標準インターフェースです。標準インターフェースを持つことで、WSGI をサポートするアプリケーションを幾つもの異なる Web サーバで使うことが容易になります。
Web サーバとプログラミングフレームワークの作者だけが、WSGI デザインのあらゆる細部や特例などを知る必要があります。WSGI アプリケーションをインストールしたり、既存のフレームワークを使ったアプリケーションを記述するだけの皆さんは、全てについて理解する必要はありません。
wsgiref は WSGI 仕様のリファレンス実装で、これは Web サーバやフレームワークに WSGI サポートを加えるのに利用できます。これは WSGI 環境変数やレスポンスヘッダを操作するユーティリティ、 WSGI サーバ実装時のベースクラス、WSGI アプリケーションを提供する デモ用 HTTP サーバ、それと WSGI サーバとアプリケーションの WSGI 仕様 (PEP 333) 準拠のバリデーションツールを提供します。
https://wsgi.readthedocs.org/ に、WSGIに関するさらなる情報と、チュートリアルやその他のリソースへのリンクがあります。
20.4.1. wsgiref.util -- WSGI 環境のユーティリティ¶
このモジュールは WSGI 環境で使う様々なユーティリティ関数を提供します。 WSGI 環境は PEP 333 で記述されているような HTTP リクエスト変数を含む辞書です。全ての environ パラメータを取る関数は WSGI 準拠の辞書を与えられることを期待しています; 細かい仕様については PEP 333 を参照してください。
-
wsgiref.util.guess_scheme(environ)¶ environ 辞書の
HTTPS環境変数を調べることでwsgi.url_schemeが "http" か "https" のどちらであるべきか推測し、その結果を返します。戻り値は文字列です。この関数は、CGI や FastCGI のような CGI に似たプロトコルをラップするゲートウェイを作成する場合に便利です。典型的には、それらのプロトコルを提供するサーバが SSL 経由でリクエストを受け取った場合には
HTTPS変数に値 "1" "yes"、または "on" を持つでしょう。そのため、この関数はそのような値が見つかった場合には "https" を返し、そうでなければ "http" を返します。
-
wsgiref.util.request_uri(environ, include_query=1)¶ リクエスト URI 全体 (オプションでクエリ文字列を含む) を、 PEP 333 の "URL 再構築(URL Reconstruction)" にあるアルゴリズムを使って返します。 include_query が false の場合、クエリ文字列は結果となる文字列には含まれません。
-
wsgiref.util.application_uri(environ)¶ PATH_INFOとQUERY_STRING変数が無視されることを除けばrequest_uri()に似ています。結果はリクエストによって指定されたアプリケーションオブジェクトのベース URI です。
-
wsgiref.util.shift_path_info(environ)¶ PATH_INFOからSCRIPT_NAMEに一つの名前をシフトしてその名前を返します。environ 辞書は 変更されます 。PATH_INFOやSCRIPT_NAMEのオリジナルをそのまま残したい場合にはコピーを使ってください。PATH_INFOにパスセグメントが何も残っていなければ、Noneが返されます。典型的なこのルーチンの使い方はリクエスト URI のそれぞれの要素の処理で、例えばパスを一連の辞書のキーとして取り扱う場合です。このルーチンは、渡された環境を、ターゲット URL で示される別の WSGI アプリケーションの呼び出しに合うように調整します。例えば、
/fooに WSGI アプリケーションがあったとして、そしてリクエスト URL パスが/foo/bar/bazで、/fooの WSGI アプリケーションがshift_path_info()を呼んだ場合、これは "bar" 文字列を受け取り、 environ は/foo/barの WSGI アプリケーションへの受け渡しに適するように更新されます。つまり、SCRIPT_NAMEは/fooから/foo/barに変わって、PATH_INFOは/bar/bazから/bazに変化するのです。PATH_INFOが単に "/" の場合、このルーチンは空の文字列を返し、SCRIPT_NAMEの末尾にスラッシュを加えます、これはたとえ空のパスセグメントが通常は無視され、そしてSCRIPT_NAMEは通常スラッシュで終わる事が無かったとしてもです。これは意図的な振る舞いで、このルーチンでオブジェクト巡回(object traversal) をした場合に/xで終わる URI と/x/で終わるものをアプリケーションが識別できることを保証するためのものです。
-
wsgiref.util.setup_testing_defaults(environ)¶ environ をテスト用に自明なデフォルト値で更新します。
このルーチンは WSGI に必要な様々なパラメータを追加します。そのようなパラメータとして
HTTP_HOST、SERVER_NAME、SERVER_PORT、REQUEST_METHOD、SCRIPT_NAME、PATH_INFO、そして PEP 333 で定義されているwsgi.*変数群が含まれます。このルーチンはデフォルト値を提供するだけで、これらの変数の既存設定は一切置きかえません。このルーチンは、ダミー環境をセットアップすることによって WSGI サーバとアプリケーションのユニットテストを容易にすることを意図しています。これは実際の WSGI サーバやアプリケーションで使うべきではありません。なぜならこのデータは偽物なのです!
使い方の例:
from wsgiref.util import setup_testing_defaults from wsgiref.simple_server import make_server # A relatively simple WSGI application. It's going to print out the # environment dictionary after being updated by setup_testing_defaults def simple_app(environ, start_response): setup_testing_defaults(environ) status = '200 OK' headers = [('Content-type', 'text/plain')] start_response(status, headers) ret = ["%s: %s\n" % (key, value) for key, value in environ.iteritems()] return ret httpd = make_server('', 8000, simple_app) print "Serving on port 8000..." httpd.serve_forever()
上記の環境用関数に加えて、 wsgiref.util モジュールも以下のようなその他のユーティリティを提供します:
-
wsgiref.util.is_hop_by_hop(header_name)¶ 'header_name' が RFC 2616 で定義されている HTTP/1.1 の "Hop-by-Hop" ヘッダの場合に true を返します。
-
class
wsgiref.util.FileWrapper(filelike, blksize=8192)¶ ファイル風オブジェクトをイテレータ(iterator)に変換するラッパです。結果のオブジェクトは
__getitem__()と__iter__()両方をサポートしますが、これは Python 2.1 と Jython の互換性のためです。オブジェクトがイテレートされる間、オプションの blksize パラメータがくり返し filelike オブジェクトのread()メソッドに渡されて受け渡す文字列を取得します。read()が空文字列を返した場合、イテレーションは終了して再開されることはありません。filelike に
close()メソッドがある場合、返されたオブジェクトもclose()メソッドを持ち、これが呼ばれた場合には filelike オブジェクトのclose()メソッドを呼び出します。使い方の例:
from StringIO import StringIO from wsgiref.util import FileWrapper # We're using a StringIO-buffer for as the file-like object filelike = StringIO("This is an example file-like object"*10) wrapper = FileWrapper(filelike, blksize=5) for chunk in wrapper: print chunk
20.4.2. wsgiref.headers -- WSGI レスポンスヘッダツール群¶
このモジュールは単一のクラス、 Headers を提供し、WSGI レスポンスヘッダの操作をマップに似たインターフェースで便利にします。
-
class
wsgiref.headers.Headers(headers)¶ headers をラップするマップ風オブジェクトを生成します。これは PEP 333 に定義されるようなヘッダの名前/値のタプルのリストです。新しい
Headersオブジェクトに与えられた変更は、一緒に作成された headers リストを直接更新します。Headersオブジェクトは典型的なマッピング操作をサポートし、これには__getitem__()、get()、__setitem__()、setdefault()、__delitem__()、__contains__()、has_key()を含みます。これらメソッドのそれぞれにおいて、キーはヘッダ名で(大文字小文字は区別しません)、値はそのヘッダ名に関連づけられた最初の値です。ヘッダを設定すると既存のヘッダ値は削除され、ラップされたヘッダのリストの末尾に新しい値が加えられます。既存のヘッダの順番は一般に維持され、ラップされたリストの最後に新しいヘッダが追加されます。辞書とは違って、
Headersオブジェクトはラップされたヘッダリストに存在しないキーを取得または削除しようとした場合にもエラーを発生しません。単に、存在しないヘッダの取得はNoneを返し、存在しないヘッダの削除は何もしません。Headersオブジェクトはkeys()、values()、items()メソッドもサポートします。複数の値を持つヘッダがある場合には、keys()とitems()で返されるリストは同じキーを一つ以上含むことがあります。Headersオブジェクトのlen()は、そのitems()の長さと同じであり、ラップされたヘッダリストの長さと同じです。実際、items()メソッドは単にラップされたヘッダリストのコピーを返しているだけです。Headersオブジェクトに対してstr()を呼ぶと、HTTP レスポンスヘッダとして送信するのに適した形に整形された文字列を返します。それぞれのヘッダはコロンとスペースで区切られた値と共に一列に並んでいます。それぞれの行はキャリッジリターンとラインフィードで終了し、文字列は空行で終了しています。これらのマッピングインターフェースと整形機能に加えて、
Headersオブジェクトは複数の値を持つヘッダの取得と追加、MIME パラメータでヘッダを追加するための以下のようなメソッド群も持っています:-
get_all(name)¶ 指定されたヘッダの全ての値のリストを返します。
返されるリストは、元々のヘッダリストに現れる順、またはこのインスタンスに追加された順に並んでいて、重複を含む場合があります。削除されて加えられたフィールドは全てヘッダリストの末尾に付きます。与えられた name に対するフィールドが何もなければ、空のリストが返ります。
-
add_header(name, value, **_params)¶ (複数の値を持つ可能性のある) ヘッダを、キーワード引数を通じて指定するオプションの MIME パラメータと共に追加します。
name は追加するヘッダフィールドです。このヘッダフィールドに MIME パラメータを設定するためにキーワード引数を使うことができます。それぞれのパラメータは文字列か
Noneでなければいけません。パラメータ中のアンダースコアはダッシュ (-) に変換されます。これは、ダッシュが Python の識別子としては不正なのですが、多くの MIME パラメータはダッシュを含むためです。パラメータ値が文字列の場合、これはヘッダ値のパラメータにname="value"の形で追加されます。この値がもしNoneの場合、パラメータ名だけが追加されます。(これは値なしの MIME パラメータの場合に使われます。)使い方の例は:h.add_header('content-disposition', 'attachment', filename='bud.gif')
上記はこのようなヘッダを追加します:
Content-Disposition: attachment; filename="bud.gif"
-
20.4.3. wsgiref.simple_server -- シンプルな WSGI HTTP サーバ¶
このモジュールは WSGI アプリケーションを提供するシンプルな HTTP サーバです (BaseHTTPServer がベースです)。個々のサーバインスタンスは単一の WSGI アプリケーションを、特定のホストとポート上で提供します。もし一つのホストとポート上で複数のアプリケーションを提供したいならば、 PATH_INFO をパースして個々のリクエストでどのアプリケーションを呼び出すか選択するような WSGI アプリケーションを作る必要があります。(例えば、 wsgiref.util から shift_path_info() を利用します。)
-
wsgiref.simple_server.make_server(host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler)¶ host と port 上で待機し、 app へのコネクションを受け付ける WSGI サーバを作成します。戻り値は与えられた server_class のインスタンスで、指定された handler_class を使ってリクエストを処理します。 app は PEP 333 で定義されるところの WSGI アプリケーションでなければいけません。
使い方の例:
from wsgiref.simple_server import make_server, demo_app httpd = make_server('', 8000, demo_app) print "Serving HTTP on port 8000..." # Respond to requests until process is killed httpd.serve_forever() # Alternative: serve one request, then exit httpd.handle_request()
-
wsgiref.simple_server.demo_app(environ, start_response)¶ この関数は小規模ながら完全な WSGI アプリケーションで、 "Hello world!" メッセージと、 environ パラメータに提供されているキー/値のペアを含むテキストページを返します。これは WSGI サーバ (
wsgiref.simple_serverのような) がシンプルな WSGI アプリケーションを正しく実行できるかを確かめるのに便利です。
-
class
wsgiref.simple_server.WSGIServer(server_address, RequestHandlerClass)¶ WSGIServerインスタンスを作成します。 server_address は(host,port)のタプル、そして RequestHandlerClass はリクエストの処理に使われるBaseHTTPServer.BaseHTTPRequestHandlerのサブクラスでなければいけません。make_server()が細かい調整をやってくれるので、通常はこのコンストラクタを呼ぶ必要はありません。WSGIServerはBaseHTTPServer.HTTPServerのサブクラスなので、その全てのメソッド (serve_forever()やhandle_request()のような) が利用できます。WSGIServerも以下のような WSGI 固有メソッドを提供します:-
set_app(application)¶ 呼び出し可能 (callable) な application をリクエストを受け取る WSGI アプリケーションとして設定します。
-
get_app()¶ 現在設定されている呼び出し可能 (callable) アプリケーションを返します。
しかしながら、通常はこれらの追加されたメソッドを使う必要はありません。
set_app()は普通はmake_server()によって呼ばれ、get_app()は主にリクエストハンドラインスタンスの便宜上存在するからです。-
-
class
wsgiref.simple_server.WSGIRequestHandler(request, client_address, server)¶ 与えられた request (すなわちソケット)の HTTP ハンドラ、 client_address (
(host,port)のタプル)、 server (WSGIServerインスタンス) の HTTP ハンドラを作成します。このクラスのインスタンスを直接生成する必要はありません; これらは必要に応じて
WSGIServerオブジェクトによって自動的に生成されます。しかしながら、このクラスをサブクラス化し、make_server()関数に handler_class として与えることは可能でしょう。サブクラスにおいてオーバーライドする意味のありそうなものは:-
get_environ()¶ リクエストに対する WSGI 環境を含む辞書を返します。デフォルト実装では
WSGIServerオブジェクトのbase_environ辞書属性のコンテンツをコピーし、それから HTTP リクエスト由来の様々なヘッダを追加しています。このメソッド呼び出し毎に、 PEP 333 に指定されている関連する CGI 環境変数を全て含む新規の辞書を返さなければいけません。
-
get_stderr()¶ wsgi.errorsストリームとして使われるオブジェクトを返します。デフォルト実装では単にsys.stderrを返します。
-
handle()¶ HTTP リクエストを処理します。デフォルト実装では実際の WGI アプリケーションインターフェースを実装するのに
wsgiref.handlersクラスを使ってハンドラインスタンスを作成します。
-
20.4.4. wsgiref.validate --- WSGI 準拠チェッカー¶
WSGI アプリケーションのオブジェクト、フレームワーク、サーバまたはミドルウェアの作成時には、その新規のコードを wsgiref.validate を使って準拠の検証をすると便利です。このモジュールは WSGI サーバやゲートウェイと WSGI アプリケーションオブジェクト間の通信を検証する WSGI アプリケーションオブジェクトを作成する関数を提供し、双方のプロトコル準拠をチェックします。
このユーティリティは完全な PEP 333 準拠を保証するものでないことは注意してください; このモジュールでエラーが出ないことは必ずしもエラーが存在しないことを意味しません。しかしこのモジュールがエラーを出したならば、ほぼ確実にサーバかアプリケーションのどちらかが 100% 準拠ではありません。
このモジュールは lan Bicking の "Python Paste" ライブラリの paste.lint モジュールをベースにしています。
-
wsgiref.validate.validator(application)¶ application をラップし、新しい WSGI アプリケーションオブジェクトを返します。返されたアプリケーションは全てのリクエストを元々の application に転送し、application とそれを呼び出すサーバの両方が WSGI 仕様と RFC 2616 の両方に準拠しているかをチェックします。
何らかの非準拠が検出されると、
AssertionError例外が送出されます; しかし、このエラーがどう扱われるかはサーバ依存であることに注意してください。例えば、wsgiref.simple_serverとその他wsgiref.handlersベースのサーバ(エラー処理メソッドが他のことをするようにオーバライドしていないもの)は単純にエラーが発生したというメッセージとトレースバックのダンプをsys.stderrやその他のエラーストリームに出力します。このラッパは、疑わしいものの実際には PEP 333 で禁止されていないかもしれない挙動を指摘するために
warningsモジュールを使って出力を生成します。これらは Python のコマンドラインオプションやwarningsAPI で抑制されなければ、sys.stderr(wsgi.errorsでは ありません 。ただし、たまたま同一のオブジェクトだった場合を除く)に書き出されます。使い方の例:
from wsgiref.validate import validator from wsgiref.simple_server import make_server # Our callable object which is intentionally not compliant to the # standard, so the validator is going to break def simple_app(environ, start_response): status = '200 OK' # HTTP Status headers = [('Content-type', 'text/plain')] # HTTP Headers start_response(status, headers) # This is going to break because we need to return a list, and # the validator is going to inform us return "Hello World" # This is the application wrapped in a validator validator_app = validator(simple_app) httpd = make_server('', 8000, validator_app) print "Listening on port 8000...." httpd.serve_forever()
20.4.5. wsgiref.handlers -- サーバ/ゲートウェイのベースクラス¶
このモジュールは WSGI サーバとゲートウェイ実装のベースハンドラクラスを提供します。これらのベースクラスは、CGI 風の環境と、それに加えて入力、出力そしてエラーストリームが与えられることで、WSGI アプリケーションとの通信の大部分を処理します。
-
class
wsgiref.handlers.CGIHandler¶ sys.stdin、sys.stdout、sys.stderrそしてos.environ経由での CGI ベースの呼び出しです。これは、もしあなたが WSGI アプリケーションを持っていて、これを CGI スクリプトとして実行したい場合に有用です。単にCGIHandler().run(app)を起動してください。appはあなたが起動したい WSGI アプリケーションオブジェクトです。このクラスは
BaseCGIHandlerのサブクラスで、これはwsgi.run_onceを true、wsgi.multithreadを false、そしてwsgi.multiprocessを true にセットし、常にsysとosを、必要な CGI ストリームと環境を取得するために使用します。
-
class
wsgiref.handlers.BaseCGIHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False)¶ CGIHandlerに似ていますが、sysとosモジュールを使う代わりに CGI 環境と I/O ストリームを明示的に指定します。 multithread と multiprocess の値は、ハンドラインスタンスにより実行されるアプリケーションのwsgi.multithreadとwsgi.multiprocessフラグの設定に使われます。このクラスは
SimpleHandlerのサブクラスで、HTTP の "本サーバ" でないソフトウェアと使うことを意図しています。もしあなたがStatus:ヘッダを HTTP ステータスを送信するのに使うようなゲートウェイプロトコルの実装(CGI、FastCGI、SCGIなど)を書いている場合、おそらくSimpleHandlerではなくこのクラスをサブクラス化するとよいでしょう。
-
class
wsgiref.handlers.SimpleHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False)¶ BaseCGIHandlerと似ていますが、HTTP の本サーバと使うためにデザインされています。もしあなたが HTTP サーバ実装を書いている場合、おそらくBaseCGIHandlerではなくこのクラスをサブクラス化するとよいでしょう。このクラスは
BaseHandlerのサブクラスです。これは__init__()、get_stdin()、get_stderr()、add_cgi_vars()、_write()、_flush()をオーバーライドして、コンストラクタから明示的に環境とストリームを設定するようにしています。与えられた環境とストリームはstdin、stdout、stderrそれにenviron属性に保存されています。
-
class
wsgiref.handlers.BaseHandler¶ これは WSGI アプリケーションを実行するための抽象ベースクラスです。それぞれのインスタンスは一つの HTTP リクエストを処理します。しかし原理上は複数のリクエスト用に再利用可能なサブクラスを作成することができます。
BaseHandlerインスタンスは外部から利用されるたった一つのメソッドを持ちます:-
run(app)¶ 指定された WSGI アプリケーション、app を実行します。
その他の全ての
BaseHandlerのメソッドはアプリケーション実行プロセスでこのメソッドから呼ばれます。したがって、それらは主にそのプロセスのカスタマイズのために存在しています。以下のメソッドはサブクラスでオーバーライドされなければいけません:
-
_write(data)¶ 文字列の data をクライアントへの転送用にバッファします。このメソッドが実際にデータを転送しても OK です: 下部システムが実際にそのような区別をしている場合に効率をより良くするために、
BaseHandlerは書き出しとフラッシュ操作を分けているからです。
-
get_stdin()¶ 現在処理中のリクエストの
wsgi.inputとしての利用に適当な入力ストリームオブジェクトを返します。
-
get_stderr()¶ 現在処理中のリクエストの
wsgi.errorsとしての利用に適当な出力ストリームオブジェクトを返します。
-
add_cgi_vars()¶ 現在のリクエストの CGI 変数を
environ属性に追加します。
オーバーライドされることの多いメソッド及び属性を以下に挙げます。しかし、このリストは単にサマリであり、オーバーライド可能な全てのメソッドは含んでいません。カスタマイズした
BaseHandlerサブクラスを作成しようとする前に docstring やソースコードでさらなる情報を調べてください。WSGI 環境のカスタマイズのための属性とメソッド:
-
wsgi_multithread¶ wsgi.multithread環境変数で使われる値。BaseHandlerではデフォルトが true ですが、別のサブクラスではデフォルトで(またはコンストラクタによって設定されて)異なる値を持つことがあります。
-
wsgi_multiprocess¶ wsgi.multiprocess環境変数で使われる値。BaseHandlerではデフォルトが true ですが、別のサブクラスではデフォルトで(またはコンストラクタによって設定されて)異なる値を持つことがあります。
-
wsgi_run_once¶ wsgi.run_once環境変数で使われる値。BaseHandlerではデフォルトが false ですが、CGIHandlerはデフォルトでこれを true に設定します。
-
os_environ¶ 全てのリクエストの WSGI 環境に含まれるデフォルトの環境変数。デフォルトでは
wsgiref.handlersがインポートされた時点のos.environのコピーですが、サブクラスはクラスまたはインスタンスレベルでそれら自身のものを作ることができます。デフォルト値は複数のクラスとインスタンスで共有されるため、この辞書は読み取り専用と考えるべきだという点に注意してください。
-
server_software¶ origin_server属性が設定されている場合、この属性の値がデフォルトのSERVER_SOFTWAREWSGI 環境変数の設定や HTTP レスポンス中のデフォルトのServer:ヘッダの設定に使われます。これは (BaseCGIHandlerやCGIHandlerのような) HTTP オリジンサーバでないハンドラでは無視されます。
-
get_scheme()¶ 現在のリクエストで使われている URL スキームを返します。デフォルト実装は
wsgiref.utilのguess_scheme()を使い、現在のリクエストのenviron変数に基づいてスキームが"http" か "https" かを推測します。
-
setup_environ()¶ environ属性を、フル実装 (fully-populated) の WSGI 環境に設定します。デフォルトの実装は、上記全てのメソッドと属性、加えてget_stdin()、get_stderr()、add_cgi_vars()メソッドとwsgi_file_wrapper属性を利用します。これは、キーが存在せず、origin_server属性が true 値でserver_software属性も設定されている場合にSERVER_SOFTWAREを挿入します。
例外処理のカスタマイズのためのメソッドと属性:
-
log_exception(exc_info)¶ exc_info タプルをサーバログに記録します。exc_info は
(type, value, traceback)のタプルです。デフォルトの実装は単純にトレースバックをリクエストのwsgi.errorsストリームに書き出してフラッシュします。サブクラスはこのメソッドをオーバーライドしてフォーマットを変更したり出力先の変更、トレースバックを管理者にメールしたりその他適切と思われるいかなるアクションも取ることができます。
-
traceback_limit¶ デフォルトの
log_exception()メソッドで出力されるトレースバック出力に含まれる最大のフレーム数です。Noneならば、全てのフレームが含まれます。
-
error_output(environ, start_response)¶ このメソッドは、ユーザに対してエラーページを出力する WSGI アプリケーションです。これはクライアントにヘッダが送出される前にエラーが発生した場合にのみ呼び出されます。
このメソッドは
sys.exc_info()を使って現在のエラー情報にアクセスでき、その情報はこれを呼ぶときに start_response に渡すべきです (PEP 333 の "Error Handling" セクションに記述があります)。デフォルト実装は単に
error_status、error_headers、error_body属性を出力ページの生成に使います。サブクラスではこれをオーバーライドしてもっと動的なエラー出力をすることができます。しかし、セキュリティの観点からは診断をあらゆるユーザに吐き出すことは推奨されないことに気をつけてください; 理想的には、診断的な出力を有効にするには何らかの特別なことをする必要があるようにすべきで、これがデフォルト実装では何も含まれていない理由です。
-
error_headers¶ エラーレスポンスで使われる HTTP ヘッダです。これは PEP 333 で述べられているような、 WSGI レスポンスヘッダ (
(name, value)タプル) のリストであるべきです。デフォルトのリストはコンテントタイプをtext/plainにセットしているだけです。
-
error_body¶ エラーレスポンスボディ。これは HTTP レスポンスのボディ文字列であるべきです。これはデフォルトではプレーンテキストで "A server error occurred. Please contact the administrator." です。
PEP 333 の "オプションのプラットフォーム固有のファイルハンドリング" 機能のためのメソッドと属性:
-
wsgi_file_wrapper¶ wsgi.file_wrapperファクトリ、またはNoneです。この属性のデフォルト値はwsgiref.util.FileWrapperクラスです。
-
sendfile()¶ オーバーライドしてプラットフォーム固有のファイル転送を実装します。このメソッドはアプリケーションの戻り値が
wsgi_file_wrapper属性で指定されたクラスのインスタンスの場合にのみ呼ばれます。これはファイルの転送が成功できた場合には true を返して、デフォルトの転送コードが実行されないようにするべきです。このデフォルトの実装は単に false 値を返します。
その他のメソッドと属性:
-
origin_server¶ この属性はハンドラの
_write()と_flush()が、特別にStatus:ヘッダに HTTP ステータスを求めるような CGI 風のゲートウェイプロトコル経由でなく、クライアントと直接通信をするような場合には true 値に設定されているべきです。この属性のデフォルト値は
BaseHandlerでは true ですが、BaseCGIHandlerとCGIHandlerでは false です。
-
http_version¶ origin_serverが true の場合、この文字列属性はクライアントへのレスポンスセットの HTTP バージョンの設定に使われます。デフォルトは"1.0"です。
-
20.4.6. 例¶
これは動作する "Hello World" WSGIアプリケーションです:
from wsgiref.simple_server import make_server
# Every WSGI application must have an application object - a callable
# object that accepts two arguments. For that purpose, we're going to
# use a function (note that you're not limited to a function, you can
# use a class for example). The first argument passed to the function
# is a dictionary containing CGI-style environment variables and the
# second variable is the callable object (see PEP 333).
def hello_world_app(environ, start_response):
status = '200 OK' # HTTP Status
headers = [('Content-type', 'text/plain')] # HTTP Headers
start_response(status, headers)
# The returned object is going to be printed
return ["Hello World"]
httpd = make_server('', 8000, hello_world_app)
print "Serving on port 8000..."
# Serve until process is killed
httpd.serve_forever()
