2007年12月15日

普通のWSGIアプリでToscaWidgetsを使うサンプル


retrieve_resourceで、必要なcssやjsのリソースを取り出して、テンプレート内で展開するのがポイント。
HTMLレンダリング結果をlxmlで解析して、リソースリンクを挿入する方法が今検討されていて、TGWidgetsMiddleware生成時に、inject_resourcesをTrueにすると使えるようになっているのだけど、うまく動かなかった。


import sampleapp
from paste.deploy.config import ConfigMiddleware
from toscawidgets.middleware import TGWidgetsMiddleware
from toscawidgets.mods.base import HostFramework

def make_app(
global_conf,
greeting,
**kw):

app = sampleapp.application

conf = global_conf.copy()
conf.update(kw)
app = TGWidgetsMiddleware(app, HostFramework())
app = ConfigMiddleware(app, conf)
return app



from toscawidgets.api import Widget,WidgetsList
from toscawidgets.resources import retrieve_resources
from toscawidgets.widgets.forms import TableForm,TextField, CalendarDatePicker
from toscawidgets.widgets.forms import validators

import formencode
import tempita
import webob


class UserForm(TableForm):
class fields(WidgetsList):
name = TextField('name', validator=validators.UnicodeString(not_empty=True))
birthday = CalendarDatePicker('birthday')

userForm = UserForm()

templ = """<html>
<head>
{{for h in resources['head']}}
{{h.display() | html}}
{{endfor}}
</head>
<body>
{{for h in resources['bodytop']}}
{{h.display() | html}}
{{endfor}}

{{form() | html}}

{{for h in resources['bodybottom']}}
{{h.display() | html}}
{{endfor}}

</body>
</html>
"""
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/html')])
form = userForm
if environ['REQUEST_METHOD'] == 'POST':
request = webob.Request(environ)
try:
params = form.validate(request.params)
return 'Tanks %(name)s!' % params
except formencode.Invalid:
pass
resources = retrieve_resources(form)
template = tempita.HTMLTemplate(templ)
content = template.substitute(form=form, resources=resources)
return content