junoを使ってみた(2)〜テンプレート・デバッガ
junoを使ってみた(1)の続き。
テンプレートはJinja2,デバッガはWerkzeugを使います。
参考資料は以下です
- http://github.com/breily/juno/blob/8f7695a5f3be04d44f1cf4104828ed9dfaf143ff/doc/2-configuration.md
- http://github.com/breily/juno/blob/8f7695a5f3be04d44f1cf4104828ed9dfaf143ff/doc/6-templates.md
GAE以外の場合
設定は次のようになります。
# -*- coding: utf-8 -*- from juno import * init({ 'use_debugger': True,#debugger使用時に指定。werkzeugのdebuggerで表示される。 }) @route('/') def index(web): template('index.html',name="Ehren") #テンプレートを使いたい場合にはこのメソッドを使う。 run()
werkzeugのデバッガが表示されました。インラインコンソールが使えたり、ソースの該当行を表示できたりと非常に高機能。これはいい!
さて、ソースを追ったところ、テンプレートの標準フォルダはtemplatesフォルダです。
というわけでtemplatesフォルダにindex.htmlをおきます。
junoの標準はJinja2なので今回はJinja2を使います。
<p>hello world! {{name}}</p>
無事テンプレートが使えました。
GAEの場合
理由はわかりませんがテンプレートフォルダ(標準ではtemplates)が見つからないようです。
というわけで設定してやる必要があります。また、GAEには当然Jinja2*1,Werkzeugが含まれていませんので、
同一フォルダにダウンロードしたJinja2,werkzeugを含める必要があります。
# -*- coding: utf-8 -*- from juno import * ROOT_PATH = os.path.dirname(__file__) TEMPLATE_DIRS = ( os.path.join(ROOT_PATH, 'templates') ) init({ 'use_db': False, 'template_root': TEMPLATE_DIRS, #テンプレートフォルダを指定 'log': False, 'use_debugger': True, }) @route('/') def index(web): template('index.html',name="Ehren") run()
これで動くのですが一つだけ問題が。。GAEではWerkzeugのデバッガでインラインコンソール、ソースの該当行を表示が動きません。。
すごく悲しいのでちょっと調べてみたところ、次のサイトを見つけました。
- Google App Engine 一人勉強会 第二回 jinja デビューとデバッグ
- Using Werzeug's Debugger With AppEngine
- Google App Engine で Werkzeug のデバッガを使う
- A patch for Werkzeug debugger on GAE *2
なるほどwerkzeugのDebuggedApplicationをシングルトンにする必要があるようです。Junoだとこの処理はjuno.py側で行っているので、juno.py自体に手を入れる必要があります。。。
ひーひーいいながら、上記を参考にとりあえずインラインコンソール、ソースの該当行表示ができるようにしました。
残念ながら、dump()が使えません。ソースを追ってもこれ以上よくわからないのでとりあえずここまでで涙を呑んで我慢します。orz*3
731c731,732
< middleware_list.append(('werkzeug.DebuggedApplication', {'evalex': True}))
---
> if config('mode')!="appengine":
> middleware_list.append(('werkzeug.DebuggedApplication', {'evalex': True}))
778a780,781
> _debugged_app = None
>
780c783
< sys.stdout = sys.stderr
---
> #sys.stdout = sys.stderr
782c785,804
< run_wsgi_app(get_application(process_func))
---
>
> app = get_application(process_func)
>
> if config('use_debugger'):
> if 'SERVER_SOFTWARE' in os.environ and os.environ['SERVER_SOFTWARE'].startswith('Dev'):
> import debug.utils
> sys.modules['werkzeug.debug.utils'] = debug.utils
>
> import inspect
> inspect.getsourcefile = inspect.getfile
>
> from werkzeug import DebuggedApplication
> global _debugged_app
> if _debugged_app is None:
> _debugged_app = app = DebuggedApplication(app, evalex=True)
> else:
> app = _debugged_app
>
> run_wsgi_app(app)
> #run_wsgi_app(get_application(process_func))

