WSGIとPythonでスマートなWebアプリケーション開発を

第1回 WSGIの概要

この記事を読むのに必要な時間:およそ 2 分

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.」 と表示されます。

著者プロフィール

保坂翔馬(ほさか しょうま)

CGプロダクションでプログラマとしてPloneで作成した社内情報共有ポータルの開発・管理,3Dモデリングソフトのツール・プラグイン開発,システム管理用補助ツール作成など幅広く仕事をしている。主たる業務はPloneポータルの開発。

仲間内ではプログラム言語オタクで通っており,好きな言語はPython, Haskell。

Twitter:@shomah4a