Web Server Gateway Interface
WSGIには二つの側 — サーバ側とアプリケーション側が存在する。WSGIは、リクエスト情報・レスポンスヘッダ・レスポンス本文を、両者の間でどのようにやりとりするかをPythonのAPIとして定義している。
Webサーバにリクエストが来ると、次のような流れでやりとりが行なわれる:
サーバ側が、クライアントからリクエストを受ける。
サーバ側は、アプリケーション側がエントリポイントとして提供するcallableオブジェクト(関数やクラスインスタンスなど __call__ が定義されたオブジェクト)を呼び出して、その引数として環境変数と1つのコールバック用callableオブジェクトを渡す。
アプリケーション側は、このコールバック用callableオブジェクトを呼び出すことでステータスコードとレスポンスヘッダをサーバ側に伝え、さらに本文を生成するiterableオブジェクト(イテレータやリストなど)を戻り値として返す。
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をサポートするWebアプリケーションフレームワークは多数存在する。その一例を示す:
BlueBream
Bottle
CherryPy
Django
Flask
Google App Engine
Pylons
Pyramid
Tornado (www.tornadoweb.org)
Trac (trac.edgewall.org)
TurboGears
web.py
web2py
Werkzeug
Zope (バージョン3以降)