2011年8月13日土曜日

WSGIを簡単に試してみる(mod_wsgi)

最近、WSGI系のWebアプリケーションのインタフェース(WSGI,Rack,JSGI,PSGI)に興味があるので、WSGIを簡単に試してみるメモです。Apacheとmod_wsgiを使う例です。

1. Apache + mod_wsgiで簡単に試す

Apacheで、/に来たリクエストを、自前のWSGI/pythonスクリプトに任せる設定。UbuntuでApacheとmod_wsgiを使う。

・ubunru 11で、apache2やmod_wsgi一式を入れる。
apt-get install libapache2-mod-wsgi

・自前のスクリプトapplication.wsgiを準備する。
/usr/local/www/wsgi-scripts/application.wsgiとして、
def application(env, start_response):
  start_response('200 OK', [('Content-type', 'text/plain')])
  return ['Hello world']

・apacheの設定をする。/に来たリクエストを、自前のプログラムapplication.wsgiに任せる設定。
/etc/apache2/conf.d/wsgi-rootとして、
<Virtualhost *:80>
    WSGIScriptAlias / /usr/local/www/wsgi-scripts/application.wsgi

    <Directory /usr/local/www/wsgi-scripts>
    Order allow,deny
    Allow from all
    </Directory>
</VirtualHost>

・apacheをリスタートし
/etc/init.d/apache2 restart

・ブラウザから、「http://ご自分のサーバー/」としてみると、「Hello World」と表示される。

2. もう少しWebアプリケーションっぽく

・Query Stringをエコー(危険)するapplication.wsgi例
def application(env, start_response):
  start_response('200 OK', [('Content-type', 'text/html')])
  return ['insecure query string echo', '<hr>', env['QUERY_STRING'], '<hr>']

ブラウザから、「http://ご自分のサーバー/?test1=hello&test2=world」とかしてみる。query string一式"test1=hello&test2=world"がまるっと表示される。

・いわゆるGET値の取得(ついでに返信時にescapeしてみる)するapplication.wsgi例
from cgi import parse_qs, escape

def application(env, start_response):
  q = parse_qs(env['QUERY_STRING'])
  start_response('200 OK', [('Content-type', 'text/html')])
  return ['hello', '<hr>',escape(q.get('test1', [''])[0]), '<hr>']

ブラウザから、「http://ご自分のサーバー/?test1=hello&test2=world」とかしてみる。test1の値"hello"が、表示される。

ちなみにPOSTは、wsgi.inputを介して受け取るので、少し面倒です。

まじめにアプリケーションを作るには、WSGIの高級なフレームワーク(Djangoなど)を使うのがいいんでしょう。

0 件のコメント:

コメントを投稿