Web Server Gateway Interface ( WSGI、発音はwhiskey [ 1 ] [ 2 ]またはWIZ -ghee [ 3 ] ) は、Web サーバーがPython プログラミング言語で記述されたWeb アプリケーションまたはフレームワークにリクエストを転送するためのシンプルな呼び出し規約です。WSGI の現在のバージョンであるバージョン 1.0.1 は、 Python Enhancement Proposal (PEP) 3333 [ 4 ]で規定されています。
WSGIは元々2003年にPEP-333として規定されました。[ 5 ] 2010年に公開されたPEP-3333は、 Python 3の仕様を更新しています。
2003年当時、PythonのWebフレームワークは通常、CGI、FastCGI、mod_python 、または特定のWebサーバーのその他のカスタムAPIのみを対象として記述されていました。[ 6 ] PEP 333を引用すると次のようになります。
Python には現在、Zope、Quixote、Webware、SkunkWeb、PSO、Twisted Web など、さまざまな Web アプリケーション フレームワークがあります。選択肢が多すぎると、Python の新規ユーザーにとっては問題になることがあります。一般的に、Web フレームワークの選択によって使用できる Web サーバーの選択肢が制限され、その逆もまた然りです。一方、Java にも同様に多くの Web アプリケーション フレームワークがありますが、Java の「サーブレット」 API により、Java Web アプリケーション フレームワークで記述されたアプリケーションは、サーブレット API をサポートする任意の Web サーバーで実行できます。
WSGIは、WebサーバーとWebアプリケーションまたはフレームワーク間の実装に依存しないインターフェースとして作成され、移植可能なWebアプリケーション開発のための共通基盤を促進します。[ 4 ]
WSGIには2つの側面がある。
サーバーとアプリケーションの間には、1つまたは複数のWSGIミドルウェアコンポーネントが存在する可能性があり、これらは通常PythonコードでAPIの両側を実装します。
WSGIは、Pythonインタープリタの起動方法や、アプリケーションオブジェクトのロードまたは設定方法を規定しておらず、様々なフレームワークやWebサーバーがそれぞれ異なる方法でこれを実現している。
WSGIミドルウェアコンポーネントは、それ自体がWSGIアプリケーションであるPython呼び出し可能オブジェクトですが、他のWSGIアプリケーションに処理を委任することでリクエストを処理することができます。これらのアプリケーション自体もWSGIミドルウェアコンポーネントである可能性があります。[ 7 ]
ミドルウェアコンポーネントは、次のような機能を実行できます。[ 7 ]
Pythonで書かれたWSGI互換の「Hello, World! 」アプリケーション:
def application ( environ , start_response ):start_response ( "200 OK " , [( "Content-Type " , "text/plain" )])yield b "こんにちは、世界!\n "どこ:
applicationenvironstart_responseenvironstart_responsestatusresponse_headersstart_response、HTTPステータスとして「200 OK」、レスポンスヘッダーとして「Content-Type」を指定して呼び出します。WSGI ネットワーク サーバーの完全な例は、この記事の範囲外です。以下は、WSGI アプリケーションを呼び出し、その HTTP ステータス行、レスポンス ヘッダー、レスポンス ボディを Python オブジェクトとして取得する方法の概略です。[ 10 ]ディクショナリの構築方法の詳細はenviron省略されています。
from io import BytesIOdef call_application ( app , environ ): status = None headers = None body = BytesIO ()def start_response ( rstatus , rheaders ): nonlocal status , headers status , headers = rstatus , rheadersapp_iter = app ( environ , start_response ) try : for data in app_iter : assert ( status is not None and headers is not None ), "start_response() が呼び出されませんでした" body . write ( data ) finally : if hasattr ( app_iter , "close" ): app_iter . close () return status , headers , body . getvalue ()environ = { ... } # "environ"辞書status , headers , body = call_application ( app , environ )数多くのWebフレームワークがWSGIをサポートしています。
現在、 FastCGI、CGI、SCGI、AJP(flupを使用)、twisted.web、Apache(mod_wsgiまたはmod_pythonを使用)、nginx(ngx_http_uwsgi_moduleを使用)、[ 27 ] Nginx Unit(Python言語モジュールを使用)、[ 28 ]およびMicrosoft IIS(WFastCGI、[ 29 ] isapi-wsgi、[ 30 ] PyISAPIe、[ 31 ]またはASPゲートウェイを使用)用のラッパーが利用可能です。
__call__メソッドを持つインスタンス」