nullpobug勉強会04 "wsgiってなに"
またも間が空いてしまったnullpobug勉強会と、そのまとめ。
今回のテーマはwsgiについて。
講師:id:nullpobug
生徒:id:feiz
具体的に
うごかしてみる
動かさなければ始まらない。
python2.5以降にはwsgirefというパッケージがあって、wsgiハンドラとかデモアプリとかが用意されてるのでそれを使ってみる。
In [1]: from wsgiref.handlers import CGIHandler In [2]: from wsgiref.simple_server import demo_app In [3]: handler = CGIHandler() In [4]: handler.run(demo_app) Status: 200 OK Content-Type: text/plain Content-Length: 1209 Hello world! COMMAND_MODE = 'unix2003' HOME = '/Users/feiz' LANG = 'ja_JP.UTF-8' (中略) wsgi.multiprocess = True wsgi.multithread = False wsgi.run_once = True wsgi.url_scheme = 'http' wsgi.version = (1, 0)
でけた。
CGIHandlarはCGI動作するwsgiの実装クラスで、run(application)を呼び出す事でアプリを実行する。
demo_appはHello Worldとenvを返すだけのwsgiアプリ。
wsgiミドルウェアを書く
In [5]: def hoge_middleware(env, start_response): ...: env["HOGE"] = "HOGE MIDDLEWARE" ...: return demo_app(env, start_response)
できた。以下実行結果。
In [6]: handler.run(hoge_middleware) Status: 200 OK Content-Type: text/plain Content-Length: 1234 Hello world! COMMAND_MODE = 'unix2003' HOGE = 'HOGE MIDDLEWARE' HOME = '/Users/feiz' LANG = 'ja_JP.UTF-8' (中略) wsgi.multithread = False wsgi.run_once = True wsgi.url_scheme = 'http' wsgi.version = (1, 0)
なんかいる。
DjangoとWSGI
DjangoもWSGIに対応してます。
ということでハンドラがどうなってるのか見てみる。
core/wsgi.py
class WSGIHandler(base.BaseHandler): initLock = Lock() request_class = WSGIRequest def __call__(self, environ, start_response): """以下略"""
environとstart_responseを受け取ってるっぽい。
mod_wsgiからこのハンドラを呼び出すための下準備をするスクリプトは
import os import sys PROJECT_BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) PROJECT_NAME = os.path.basename(PROJECT_BASE) SITE_BASE = os.path.dirname(PROJECT_BASE) sys.path.append(SITE_BASE) sys.path.append(PROJECT_BASE) os.environ['PYTHON_EGG_CACHE'] = os.path.join(SITE_BASE, '.python-eggs') os.environ['DJANGO_SETTINGS_MODULE'] = PROJECT_NAME + '.settings' from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler()
Djangoで必要なpathとかを設定して、最後に変数"application"にWSGIHandlerをセットしておしまい。