PythonのWebアプリケーションフレームワーク
Pythonには,Zope,Twisted,Django,TurboGearsなどのさまざまなWebアプリケーションフレームワークが存在します。以前は,このような幅広い選択肢は,新しくPythonを使用しようとするユーザにとって都合が悪いことがありました。使用するフレームワークによって,利用可能なサーバが制限されてしまったり,逆にサーバによって利用可能なWebアプリケーションフレームワークが制限されるといったことがあったためです。
そのようなPythonの状況とは対照的に,Javaにおいては,多数のWebアプリケーションフレームワークがあるにもかかわらず,サーバとWebアプリケーションをつなぐ際に,統一されたJava Servelet APIを用いることで,アプリケーションフレームワークを気にせずにServelet APIが利用できる環境で動作させることが可能です。
このような,サーバとWebアプリケーションをつなぐ共通のインターフェースをPythonで定義したものが,PEP333(日本語訳版)のWSGI(Web Server Gateway Interface)です。
WSGIの概要
WSGIはJavaにおけるJava Servelet APIと同じように,WebサーバとWebアプリケーション間の汎用的なインターフェースを定義しています。WSGIを利用することで,WebサーバとWebアプリケーションの実装を切り離すことができ,WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができるようになりました。
WSGIをサポートしているWebアプリケーションであれば, WSGIをサポートするWebサーバで容易に動かすことができます。Apacheを使用していてmod_wsgiモジュールが利用可能なサーバであれば,WSGIアプリケーションを直接実行できます。
また,サーバ側でmod_wsgiモジュールが提供されていなくとも,WSGIアプリケーションをCGIとして動作させるためのモジュールがPython(Python2.5以降)に標準で組み込まれているため,少しのコードを追加するだけでCGIとして動作させることができます。
WSGIは,現在では,
- Twisted
- Zope(Ver.3から)
- CherryPy
- TurboGears
- Django
- Pylons
などのWebアプリケーションフレームワークで利用されています。
たとえば,Zopeはそれ自体がWebアプリケーションサーバとして動作する非常に大きなフレームワークです。 Zope2までは,Webアプリケーションサーバとして動作させることしかできず,サーバ上で動作させるには新しくサーバプロセスを立ち上げなければいけませんでした。そのために,Zopeはサーバプロセスが追加できるサーバでなければ動作させることができませんでした。しかしZope3になると,Zope自体をWSGIアプリケーションとして動作させることができるようになり,サーバプロセスを立ち上げられないサーバでも動作させることができるようになりました。
Hello, world アプリケーション
WSGIで定義されているWSGIアプリケーションのインターフェースは非常にシンプルです。文章で説明をしてもわかりにくいと思いますので,まずは小さなWSGIアプリケーションを見てみましょう。
リスト1
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return 'Hello, world'
たったこれだけです。関数が1つしかありませんが,WSGIの仕様に準拠した立派なアプリケーションです。
まずはこのアプリケーションを動かしてみます。リスト1に少し付け足し,リスト2のように書き換えます。
付け足した部分は,WSGIアプリケーションを実行するためのサーバを動かす部分です。サーバとしてPython 2.5から新しく標準ライブラリに追加されたwsgirefモジュールを使用しているので,実行にはPython2.5以上が必要です。
リスト2
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return 'Hello, world'
from wsgiref import simple_server
if __name__ == '__main__':
server = simple_server.make_server('', 8080, application)
server.serve_forever()
リスト2をsample1.pyとして保存し,pythonコマンドで実行してください。
図1
$ python sample1.py
そして Web ブラウザでhttp://localhost:8080/にアクセスします。正常に実行できていれば「Hello, world.」 と表示されます。

