読者です 読者をやめる 読者になる 読者になる

Keep on moving

あんまりまとまってないことを書きますよ

junoを使ってみた(2)〜テンプレート・デバッガ

python GAE

junoを使ってみた(1)の続き。

テンプレートはJinja2,デバッガはWerkzeugを使います。
参考資料は以下です

GAE以外の場合

設定は次のようになります。

# -*- coding: utf-8 -*-

from juno import *

init({
    'use_debugger': True,#debugger使用時に指定。werkzeugのdebuggerで表示される。
    })

@route('/')
def index(web):
    template('index.html',name="Ehren") #テンプレートを使いたい場合にはこのメソッドを使う。

run()

f:id:Ehren:20090727190858p:image

werkzeugのデバッガが表示されました。インラインコンソールが使えたり、ソースの該当行を表示できたりと非常に高機能。これはいい!
さて、ソースを追ったところ、テンプレートの標準フォルダはtemplatesフォルダです。
というわけでtemplatesフォルダにindex.htmlをおきます。


junoの標準はJinja2なので今回はJinja2を使います。

<p>hello world! {{name}}</p>

f:id:Ehren:20090727191720p:image

無事テンプレートが使えました。

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のデバッガでインラインコンソール、ソースの該当行を表示が動きません。。
すごく悲しいのでちょっと調べてみたところ、次のサイトを見つけました。

なるほど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))

http://passion-orange.appspot.com/

*1:GAEのテンプレートを使おうとしましたがうまくいきませんでした。

*2:このpatchをwerkzeugに当てるとdump()が使えます。ただしJunoだとインラインコンソールが使えなくなります。。原因わからず。

*3:ここまでくるまでにWerkzeugについてもかなり調べることになりました。。GAEでデバッガが使いたければWerkzeugを使ったほうがよさそうです。