ToscaWidgetも試してみる(結局Paste)

サンプルが動きませんorz

  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/ToscaWidgets-0.1a2dev_r2777-py2.5.egg/toscawidgets/middleware.py", line 47, in __call__
    environ['paste.registry'].register(toscawidgets.framework, framework)
KeyError: 'paste.registry'

paste.registryか.とりあえずググる
RegistryManageなんぞというWSGIミドルウェアを発見。
これがpaste.registryをenvironに登録してると。
...Paste必須ですか?
直接キーを使ったインターフェイスだと、分かりづらいなあ。
グローバル変数と変わらないじゃないか。

とりあえずWSGIアプリケーションでToscaWidgetを使う場合は、以下のようにミドルウェアをスタックすればいい。

app = RegistryManager(TGWidgetsMiddleware(app, WSGIHostFramework, show_apache_config=True))

PasteDeployでfilter-chainにしたほうがスマートか?
アプリケーション必須なミドルウェアは、コードに書いてiniファイルに追い出すのは交換可能なものだけにした方が問題が少なそうな気がするが。
複数のアプリケーションをまとめたサイトにするときに、このスタックを毎回書くのは負けてる気がする。
とりあえずToscaWidgetsのentry_pointsを調べておく。

    [toscawidgets.host_frameworks]
    wsgi = toscawidgets.mods.wsgi:WSGIHostFramework
    pylons = toscawidgets.mods.pylonshf:PylonsHostFramework
    turbogears = toscawidgets.mods.tg:Turbogears

    [toscawidgets.widgets]
    widgets = toscawidgets.core
    resources = toscawidgets.resources

    [paste.paster_create_template]
    toscawidgets=toscawidgets.util:ToscaWidgetsTemplate

    [turbogears.extensions]
    toscawidgets=toscawidgets.mods.tg

    [paste.filter_app_factory]
    middleware = toscawidgets.middleware:make_middleware

toscawidgets.middleware:make_middlewareの定義は以下のようになっている。

def make_middleware(app, global_config, host_framework="wsgi", **kw):

ということで、pastedeployで以下のようにfilterを構成する。

[filter:tw]
paster.filter_app_factory = egg:ToscaWidgets#middleware
host_framework = wsgi

このフィルターを適用するにはappの方にwith-filter = tw とすればいい。

[app:main]
paste.app_factory = addressbook:factory
with-filter = tw

全てを合わせるとこうなる。

[DEFAULT]
dburi = postgres://aodag:aodag@localhost/addressbook

[app:main]
paste.app_factory = addressbook:factory
with-filter = tw

[filter:tw]
paster.filter_app_factory = egg:ToscaWidgets#middleware
host_framework = wsgi

[server:main]
use = egg:PasteScript#wsgiutils
port = 8080

server:mainはとりあえずスタンドアローンなhttpサーバー設定。
scgiで動かすなら、flupのscgiミドルに設定する。

use = egg:PasteScript#flup_scgi_thread

http://www.toscawidgets.org/
http://svn.turbogears.org/projects/ToscaWidgets/trunk/examples/wsgi_app.py