Webサーバーゲートウェイインターフェース(WSGI、発音はウィスキー[1] [2]またはウィズギー[3])は、WebサーバーがPythonプログラミング言語で書かれたWebアプリケーションまたはフレームワークにリクエストを転送するためのシンプルな呼び出し規約です。WSGIの現在のバージョンであるバージョン1.0.1は、 Python拡張提案(PEP)3333で指定されています。 [4]
WSGIはもともと2003年にPEP-333として仕様化されました。[5] 2010年に公開されたPEP-3333はPython 3の仕様を更新したものです。
背景
2003年当時、PythonウェブフレームワークはCGI、FastCGI、mod_python、または特定のウェブサーバーのカスタム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 つの側面があります。
- サーバー/ゲートウェイ側。これは、 ApacheやNginxなどの完全な Web サーバー ソフトウェアを実行している場合が多いですが、flup などの Web サーバーと通信できる軽量のアプリケーション サーバーである場合もあります。
- アプリケーション/フレームワーク側。これは、Python プログラムまたはフレームワークによって提供される Python 呼び出し可能オブジェクトです。
サーバーとアプリケーションの間には、通常は Python コードで API の両側を実装する 1 つ以上のWSGIミドルウェア コンポーネントが存在する場合があります。
WSGI では、Python インタープリターの起動方法や、アプリケーション オブジェクトの読み込み方法や構成方法が指定されておらず、フレームワークや Web サーバーによって方法が異なります。
WSGIミドルウェア
WSGIミドルウェアコンポーネントはPython呼び出し可能オブジェクトであり、それ自体がWSGIアプリケーションですが、他のWSGIアプリケーションに委任することでリクエストを処理することができます。これらのアプリケーション自体がWSGIミドルウェアコンポーネントになることもあります。[7]
ミドルウェアコンポーネントは次のような機能を実行できます。[7]
- 環境変数を適宜変更した後、ターゲットURLに基づいてリクエストを異なるアプリケーション オブジェクトにルーティングします。
- 複数のアプリケーションやフレームワークを同じプロセスで並行して実行できるようにする
- リクエストとレスポンスをネットワーク経由で転送することで、負荷分散とリモート処理を実現します。
- XSLTスタイルシートの適用など、コンテンツの後処理を実行する
例
アプリケーション例
Pythonで書かれたWSGI 互換の「Hello, World! 」アプリケーション:
def アプリケーション( environ 、 start_response ):
start_response ( '200 OK' , [( 'Content-Type' , 'text/plain' )])
yield b 'Hello, World! \n '
どこ:
- 1行目は、 2つのパラメータとを受け取る関数[8]を定義します。関数は、 CGI環境変数と、明確に定義されたキーの下にある他のリクエストパラメータとメタデータを含む辞書です。 [9]は、2つの位置パラメータとを受け取る呼び出し可能関数です。
applicationenvironstart_responseenvironstart_responsestatusresponse_headers - 2 行目は
start_response、HTTP ステータスとして「200 OK」を指定し、応答ヘッダーとして「Content-Type」を指定して を呼び出します。 - 3 行目では、関数をジェネレーターにします。レスポンスの本文は、バイト文字列の反復可能オブジェクトとして返されます。
アプリケーションを呼び出す例
WSGIネットワークサーバーの完全な例はこの記事の範囲外です。以下は、WSGIアプリケーションを呼び出して、そのHTTPステータス行、応答ヘッダー、応答本文をPythonオブジェクトとして取得する方法の概略です。[10]辞書の構築方法の詳細はenviron省略されています。
io からBytesIOをインポート
def call_application ( app , environ ):
status = None
headers = None
body = BytesIO ()
def start_response ( rstatus 、 rheaders ):
非ローカル ステータス、 ヘッダー
status 、 headers = rstatus 、 rheaders
app_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 )
WSGI互換のアプリケーションとフレームワーク
数多くのWeb フレームワークが WSGI をサポートしています。
- ビョルン
- ブルーブリーム
- ボボ[11]
- ボトル
- チェリーパイ
- ジャンゴ[12]
- イベントレット[13]
- 高速WSGI
- フラスコ
- ファルコン(ウェブフレームワーク)[14]
- ゲヴェントFastCGI [15]
- Google App Engineの webapp2
- ガンイコーン
- プレスタンス[16]
- Apacheで使用するmod_wsgi [17]
- ネティウス
- ピクニック[18]
- 貼り付けコンポーネント WebOb は、具体的には WSGI 拡張機能です。これはPylons プロジェクトによって採用されました。
- パイロン
- ピラミッド
- レストライト[19]
- 竜巻
- トラック
- ターボギア
- ユリウェブ[20]
- uWSGI
- ウェイトレス[21]
- ウェブ.py [22]
- ウェブ2パイ
- ウェブレイヤー[23]
- 機械類[24]
- ラディカル[25]
現在、FastCGI、CGI、SCGI、AJP(flupを使用)、twisted.web、Apache(mod_wsgiまたはmod_pythonを使用)、Nginx(ngx_http_uwsgi_moduleを使用)[26] Nginx Unit(Python言語モジュールを使用)[27]、Microsoft IIS(WFastCGI、[28] isapi-wsgi、[29] PyISAPIe、[30]またはASPゲートウェイを使用)のラッパーが利用可能です。
参照
- 非同期サーバーゲートウェイインターフェース(ASGI) – WSGIの精神的後継であり、非同期アプリケーションのサポートを追加します。
- Rack – Rubyウェブサーバーインターフェース
- PSGI – Perl Web サーバー ゲートウェイ インターフェース
- SCGI – シンプル コモン ゲートウェイ インターフェース
- JSGI – JavaScriptウェブサーバーゲートウェイインターフェース
参考文献
- ^ Simionato, Michele (2007 年 6 月 11 日)。「WSGI を使用した Web プログラミング入門」。
- ^ Edge, Jake (2019 年 7 月 9 日). 「マイクロフレームワークをいじくり回す」. LWN .
- ^ Goldberg, Kevin (2016-05-09). 「パフォーマンス向上のための Python WSGI サーバーの紹介 | AppDynamics」。アプリケーション パフォーマンス監視ブログ | AppDynamics。2020年 8 月 20 日閲覧。
- ^ ab "PEP 3333 - Python Web Server Gateway Interface v1.0.1". Python.org . 2018年4月4日閲覧。
- ^ 「PEP 333 -- Python Web Server Gateway Interface v1.0」。Python.org 。2018年4月4日閲覧。
- ^ 「FrontPage - Python Wiki」。Python.org 。2017年1月27日閲覧。
- ^ ab "PEP 3333 -- Python Web Server Gateway Interface v1.0.1". Python.org . 2018年4月4日閲覧。
- ^ つまり「関数、メソッド、クラス、またはメソッドを持つインスタンス
__call__」 - ^ 「PEP 3333 -- Python Web Server Gateway Interface v1.0.1」。Python.org 。2018年4月4日閲覧。
- ^ 「WSGIミドルウェアの作成 - Alan Christopher Thomas - Minted - PythonKC」。YouTube。2015年8月28日。2021年12月12日時点のオリジナルよりアーカイブ。 2017年1月27日閲覧。
- ^ “プエラリアジェルの効果は?”.ボボ.digicool.com 。2017 年 1 月 27 日に取得。
- ^ 「mod_python なしの Django、および WSGI サポート | Weblog | Django」。Djangoproject.com。2005年 7 月 18 日。2017年 1 月 27 日閲覧。
- ^ 「wsgi – WSGI サーバー — Eventlet 0.20.1 ドキュメント」。Eventlet.net。2017年1 月 27 日閲覧。
- ^ 「Falcon - Python 用ベアメタル Web API フレームワーク」 。2017年 10 月 22 日閲覧。
- ^ "gevent-fastcgi 1.0.2.1 : Python パッケージ インデックス". Pypi.python.org . 2015-12-06 . 2017-01-27に閲覧。
- ^ 「anomaly/prestans: WSGI準拠のRESTマイクロフレームワーク」。GitHub.com 。2017年1月27日閲覧。
- ^ 「Google Code アーカイブ - Google Code プロジェクト ホスティング用の長期ストレージ」。Code.google.com。2017年1 月 27 日閲覧。
- ^ 「Pycnic Framework」。Pycnic.nullism.com 。2017年1月27日閲覧。
- ^ 「theintencity/restlite: Python の軽量 RESTful サーバー ツール」。GitHub.com。2017年1 月 27 日閲覧。
- ^ 「limodou/uliweb: シンプルで使いやすい Python Web フレームワーク」。GitHub.com。2017年1 月 27 日閲覧。
- ^ 「waitress ドキュメント」。docs.pylonsproject.org。2018年 9 月 26 日閲覧。
- ^ 「Welcome to」Web.py 2009-09-11 2017-01-27閲覧。
- ^ "weblayer — weblayer v0.4.3 ドキュメント". Packages.python.org . 2017年1月27日閲覧。
- ^ 「Welcome | Werkzeug (The Python WSGI Utility Library)」。Werkzeug.pocoo.org 。2017年1月27日閲覧。
- ^ 「CalDAV および CardDAV サーバー - シンプルなカレンダーおよび連絡先サーバー」。Radicale.org。2017年1 月 27 日閲覧。
- ^ 「モジュール ngx_http_uwsgi_module」。Nginx.org 。 2017年1月27日閲覧。
- ^ 「構成 — NGINX Unit」。Unit.nginx.org 。 2023年5月4日閲覧。
- ^ 「Python Tools for Visual Studio - ドキュメント」。Pytools.codeplex.com 。2017年1月27日閲覧。
- ^ 「Google Code アーカイブ - Google Code プロジェクト ホスティング用の長期ストレージ」。Code.google.com。2017年1 月 27 日閲覧。
- ^ 「Python ISAPI Extension for IIS download | SourceForge.net」。Pyisapie.sourceforge.net 2012-04-24 。2017-01-27閲覧。
外部リンク
- PEP 333 – Python Web サーバー ゲートウェイ インターフェース
- PEP 3333 – Python Web サーバー ゲートウェイ インターフェース v1.0.1
- WSGI メタフレームワーク
- WSGI に関するあらゆる情報を網羅した wiki
- WSGI チュートリアル
- Python 標準ライブラリモジュール wsgiref
- WSGI を使い始める
- NWSGI – IronPython および IIS 用の Python WSGI 仕様の .NET 実装
- Gevent コルーチンベースのネットワークライブラリを使用して実装された Gevent-FastCGI サーバー
