GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • メインページ
  • コミュニティ・ポータル
  • 最近の出来事
  • 新しいページ
  • 最近の更新
  • おまかせ表示
  • 練習用ページ
  • アップロード (ウィキメディア・コモンズ)
  • 特別ページ
  • ヘルプ
  • 利用案内
  • 井戸端
  • お知らせ
  • バグの報告

This view

  • Original page
  • New address

GeezerVison is showing ja.wikipedia.org — Web Server Gateway Interface - Wikipedia

Web Server Gateway Interface(WSGI; ウィスキー[1][2])は、プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション(あるいはWebアプリケーションフレームワーク)を接続するための、標準化されたインタフェース定義である。また、WSGIから着想を得て、他の言語でも同様のインタフェースが作られた。

基本的な発想

過去において、Pythonに多種のWebアプリケーションフレームワークが存在することは、PythonでWebアプリケーションを開発しようとする者にとって問題になっていた。というのも、Webアプリケーションフレームワークを選択することによって、使用できるWebサーバが制限されてしまったり、その逆の制限が発生したりしたためである。Pythonで書かれたWebアプリケーションは、FastCGI, mod_python, CGI, さらにはWebサーバ独自のAPIを使ったものなど、様々な方法で実装されていた。

この問題を解決するためにWSGIが考案された。WSGIは、Pythonにおける、WebアプリケーションとWebサーバを接続する標準仕様を定めるものである。これによって、WSGIに対応したWebアプリケーション(やフレームワーク)は、WSGIに対応した任意のWebサーバ上で運用できるようになる。つまり、アプリケーション側がWSGIに対応していれば、アプリケーションのコードに修正を加えることなく、WSGI対応サーバを自由に選択することができ、高い可搬性(ポータビリティ)が得られる。

仕様の概要

WSGIには二つの側 — サーバ側とアプリケーション側が存在する。WSGIは、リクエスト情報・レスポンスヘッダ・レスポンス本文を、両者の間でどのようにやりとりするかをPythonのAPIとして定義している。

Webサーバにリクエストが来ると、次のような流れでやりとりが行なわれる:

  1. サーバ側が、クライアントからリクエストを受ける。
  2. サーバ側は、アプリケーション側がエントリポイントとして提供するcallableオブジェクト(関数やクラスインスタンスなど __call__ が定義されたオブジェクト)を呼び出して、その引数として環境変数と1つのコールバック用callableオブジェクトを渡す。
  3. アプリケーション側は、このコールバック用callableオブジェクトを呼び出すことでステータスコードとレスポンスヘッダをサーバ側に伝え、さらに本文を生成するiterableオブジェクト(イテレータやリストなど)を戻り値として返す。
  4. サーバ側は、これらを用いてクライアントへのレスポンスを生成する。

WSGIはミドルウェアの考え方も提供できる。WSGIミドルウェアは、サーバ側とアプリケーション側のWSGIインタフェースを実装しているため、WSGIサーバとWSGIアプリケーションの"中間に"挿入できる。ミドルウェアはサーバーの視点からはアプリケーションとして振る舞い、アプリケーションの視点からはサーバーとして振る舞う。

"ミドルウェア"は、例えば以下のような機能を提供できる:

  • 目標の URL にもとづき、環境変数を適宜変更し、リクエストを別のアプリケーションのオブジェクトに回送する
  • 複数のアプリケーション(やフレームワーク)が同じプロセスの中に同居して動作できるようにする
  • リクエストとレスポンスをネットワーク上で転送することによる負荷分散と遠隔処理
  • コンテンツの後処理の実行 — XSLスタイルシートを適用するなど

WSGIアプリケーションの例

既存のWSGI対応フレームワークを使用する場合は意識する必要はないが、ゼロからWSGIアプリケーションを作る場合は以下の例(Hello Worldアプリケーション)のようにする:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield b'Hello World\n'

解説:

  • WSGIアプリケーションは、callableオブジェクト (__call__が定義されたオブジェクト) として定義する(この例では application 関数)。このオブジェクトが呼び出される際、引数 environ としてCGIと同様の環境変数が渡され、引数 start_response として、ステータスコードとレスポンスヘッダを受け取るcallableオブジェクトが渡される。
  • start_response を呼び出して、ステータスコードとレスポンスヘッダを設定する。
  • WSGIアプリケーションの戻り値は、本文を生成するiteratableオブジェクトである必要がある。この例ではPythonのジェネレータ機能を使ってそれを実現している。

WSGI 互換のWebアプリケーションフレームワーク

WSGIをサポートするWebアプリケーションフレームワークは多数存在する。その一例を示す:

  • BlueBream
  • Bottle
  • CherryPy
  • Django
  • Flask
  • Google App Engine
  • Pylons
  • Pyramid
  • Tornado
  • Trac
  • TurboGears
  • web.py
  • web2py
  • Werkzeug
  • Zope (バージョン3以降)

WSGI対応サーバ

WSGIサーバ(WSGIアプリケーションコンテナ)は、WSGIアプリケーションを常駐させ、HTTPクライアントからリクエストを受け取るごとに、WSGIアプリケーションのcallableオブジェクトを呼び出す。これによって、クライアントからのリクエストがアプリケーションに転送される。

WSGIアプリケーションコンテナの例としては、uWSGI, Gunicorn, Apacheモジュール (mod_wsgi, mod_pythonなど), Microsoft IIS(isapi-wsgi, PyISAPIe, ASPゲートウェイを使用)などがある。

さらに、WSGIアプリケーションをラップすることで、FastCGIやSCGI環境で動作させることもできるし、古典的なCGIとして動作させることもできる(例えば、Python標準ライブラリに含まれるwsgiref.handlers.CGIHandlerが利用できる)。

他のプログラミング言語への影響

WSGIから着想を得て、他のプログラミング言語にも同様のインターフェイスが作られた。以下はその一例である。

  • PSGI (Perl Web Server Gateway Interface)
  • Rack (Ruby Web Server Interface)
  • SCGI
  • Ring (Clojure)
  • Clack (Common Lisp)
  • WAI (Haskell, Web Application Interface)

WSGIとPython 3

Python 3において文字列とバイト列が分離されたことはWSGIにとって問題となった。HTTPヘッダのデータはテキストとして扱われたりバイナリとして扱われたりするが、WSGIはヘッダデータを文字列として扱っている。Python 2ではテキストもバイナリも「文字列」として扱っていたためこれで問題がなかったが、Python 3ではバイナリはbytes型で扱うことになり、「文字列」とはUnicode文字列のことを表すようになった。この問題に対処した更新版のWSGI仕様は、PEP 3333として公開されている。

再考されたWSGI仕様として Web3 というものも提案されており、こちらはPEP 444 として公開されている。Web3は、互換性のないWSGIの派生であり、Python 2.6以降および3.1以降で動作するように設計されている。

脚注

  1. ↑ “An Introduction to Web Programming with WSGI”. 2020年4月29日閲覧。
  2. ↑ Edge, Jake (2019年9月). “Mucking about with microframeworks”. LWN. https://lwn.net/Articles/792882/. 

外部リンク

  • PEP 333 -- Python Web Server Gateway Interface v1.0 インターフェイス標準の最初の定義 (英語)
  • PEP 333: Python Web Server Gateway Interface v1.0 (日本語訳)
  • PEP 3333 -- Python Web Server Gateway Interface v1.0.1 インターフェイス標準の定義 (英語)
  • PEP 3333: Python Web Server Gateway Interface v1.0.1 (日本語訳)
  • WSGI のすべてにわたる分かりやすい wiki (英語)
Webインタフェース
サーバサイド
通信プロトコル
  • HTTP
    • v2
    • v3
    • 暗号化
    • WebDAV
  • CGI
  • FCGI
  • WebSocket
API
  • C ASAPI
  • C ISAPI
  • Java Servlet
  • Python WSGI
  • Perl PSGI
トピックス
  • Webサービス
  • アプリケーションサーバ
  • リソース (WWW)
  • サーバサイドスクリプト
  • Webhook
クライアントサイド
Browser APIs
  • ActiveX
  • Browser Helper Object
  • Google Native Client
  • WebAssembly
Web API
W3C
  • Canvas
  • IndexedDB
  • SVG
  • WebGPU
  • WebRTC
  • WebSocket
  • WebVTT
  • ウェブストレージ
  • Web Worker
  • XMLHttpRequest
  • オーディオ
  • ビデオ
クロノス
  • WebCL
  • WebGL
その他
  • Gears
トピックス
  • Ajax
  • DHTML
  • Mashup
関連項目
  • ウェブページ
    • 静的
    • 動的
  • ウェブアプリケーション
    • RIA
    • SPA
    • PWA
  • ウェブユーザインタフェース
スタブアイコン

この項目は、コンピュータに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています(PJ:コンピュータ/P:コンピュータ)。

  • 表示
  • 編集
「https://ja.wikipedia.org/w/index.php?title=Web_Server_Gateway_Interface&oldid=108435633」から取得
カテゴリ:
  • Python
  • ウェブ技術
隠しカテゴリ:
  • すべてのスタブ記事
  • コンピュータ関連のスタブ項目
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.