Webサーバーゲートウェイインターフェース

ウェブサーバーゲートウェイインターフェースWSGI、発音はウィスキー[ 1 ] [ 2 ]またはウィズギー[ 3 ])は、ウェブサーバーがPythonプログラミング言語で書かれたウェブアプリケーションやフレームワークにリクエストを転送するためのシンプルな呼び出し規約です。WSGI現在バージョン1.0.1、Python拡張提案(PEP)3333で規定されています[ 4 ]

WSGIはもともと2003年にPEP-333として仕様化されました。[ 5 ] 2010年に公開されたPEP-3333はPython 3の仕様を更新したものです。

背景

2003年当時、PythonウェブフレームワークはCGIFastCGImod_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 ]

アプリケーション例

Pythonで書かれたWSGI 互換の「Hello, World! 」アプリケーション:

定義アプリケーション( environ start_response ):start_response ( "200 OK" , [( "Content-Type" , "text/plain" )])結果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 rheadersapp_iter = app ( environ , start_response ) try : for data in app_iter : assert ( status is not Noneかつ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 をサポートしています。

現在、 FastCGICGISCGIAJP(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ゲートウェイを使用)のラッパーが利用可能です。

参照

参考文献

  1. ^ Simionato, Michele (2007年6月11日). 「WSGIを使ったWebプログラミング入門」 .
  2. ^ Edge, Jake (2019年7月9日). 「マイクロフレームワークをいじくり回す」 . LWN .
  3. ^ Goldberg, Kevin (2016年5月9日). 「パフォーマンス向上のためのPython WSGIサーバー入門 | AppDynamics」 .アプリケーションパフォーマンスモニタリングブログ | AppDynamics . 2020年8月20日閲覧
  4. ^ a b "PEP 3333 - Python Web Server Gateway Interface v1.0.1" . Python.org . 2018年4月4日閲覧
  5. ^ "PEP 333 -- Python Web Server Gateway Interface v1.0" . Python.org . 2018年4月4日閲覧
  6. ^ "FrontPage - Python Wiki" . Python.org . 2017年1月27日閲覧
  7. ^ a b "PEP 3333 -- Python Web Server Gateway Interface v1.0.1" . Python.org . 2018年4月4日閲覧
  8. ^つまり「関数、メソッド、クラス、または__call__メソッドを持つインスタンス」
  9. ^ "PEP 3333 -- Python Web Server Gateway Interface v1.0.1" . Python.org . 2018年4月4日閲覧
  10. ^ 「WSGIミドルウェアの作成 - Alan Christopher Thomas - Minted - PythonKC」 YouTube 2015年8月28日。2021年12月12日時点のオリジナルよりアーカイブ。 2017年1月27日閲覧
  11. ^ “プエラリアジェルの効果は?”ボボ.digicool.com 2017-01-27に取得
  12. ^ "mod_pythonなしのDjango、そしてWSGIサポート | Weblog | Django" . Djangoproject.com . 2005年7月18日. 2017年1月27日閲覧
  13. ^ 「wsgi – WSGIサーバー — Eventlet 0.20.1ドキュメント」 . Eventlet.net . 2017年1月27日閲覧。
  14. ^ 「Falcon - Python用ベアメタルWeb APIフレームワーク」 。 2017年10月22日閲覧
  15. ^ "gevent-fastcgi 1.0.2.1 : Python パッケージインデックス" . Pypi.python.org . 2015年12月6日. 2017年1月27日閲覧
  16. ^ 「anomaly/prestans: WSGI準拠のRESTマイクロフレームワーク」 . GitHub.com . 2017年1月27日閲覧
  17. ^ 「Google Code アーカイブ - Google Code プロジェクト ホスティング用の長期ストレージ」 . Code.google.com . 2017年1月27日閲覧
  18. ^ "Pycnic Framework" . Pycnic.nullism.com . 2017年1月27日閲覧。
  19. ^ "theintencity/restlite: Pythonで書かれた軽量RESTfulサーバーツール" . GitHub.com . 2017年1月27日閲覧
  20. ^ 「Socketify: PyPy3とPython3にHttp/HttpsとWebSocketの高性能サーバーを提供」 GitHub.com . 2025年8月12日閲覧
  21. ^ "limodou/uliweb: シンプルで使いやすいPythonウェブフレームワーク" . GitHub.com . 2017年1月27日閲覧。
  22. ^ "waitress ドキュメント" . docs.pylonsproject.org . 2018年9月26日閲覧。
  23. ^ "Welcome to" . Web.py. 2009年9月11日. 2017年1月27日閲覧
  24. ^ "weblayer — weblayer v0.4.3 ドキュメント" . Packages.python.org . 2017年1月27日閲覧
  25. ^ "Welcome | Werkzeug (Python WSGIユーティリティライブラリ)" . Werkzeug.pocoo.org . 2017年1月27日閲覧
  26. ^ 「CalDAVとCardDAVサーバー - シンプルなカレンダーと連絡先サーバー」 Radicale.org 2017年1月27日閲覧
  27. ^ 「モジュール ngx_http_uwsgi_module」 . Nginx.org . 2017年1月27日閲覧
  28. ^ 「設定 — NGINX Unit」 . Unit.nginx.org . 2023年5月4日閲覧
  29. ^ 「Python Tools for Visual Studio - ドキュメント」 . Pytools.codeplex.com . 2017年1月27日閲覧
  30. ^ 「Google Code アーカイブ - Google Code プロジェクト ホスティング用の長期ストレージ」 . Code.google.com . 2017年1月27日閲覧
  31. ^ 「Python ISAPI Extension for IIS download | SourceForge.net」 . Pyisapie.sourceforge.net . 2012年4月24日. 2017年1月27日閲覧