データストアに保存してある文字列をDjangoテンプレートとして使用する方法
(この記事の内容はGoogle App Engine SDK 1.6.6、Mac OX X 10.7.4で試しました)
いま、Google App Engine+Pythonで作成したアプリで、Djangoのテンプレートエンジンを使用しているのですが、テンプレートファイルの代わりに、データストアから取得してきた文字列をテンプレートとして使いたいのです。
(Movable Typeのテンプレートの仕組みのようなものを実現したい)
いつもは次のように、template.render()の結果をresponse.out.write()しています。
self.response.out.write(template.render(path, template_values))
しかし、template.render()はテンプレートファイルへのパスしか渡すことができません。
そこでちょっと調べまして、
template_string = Template.get_by_id(id).content template_object = template.Template(template_string) template_values = template.Context({ 'var1' : u'variable1', 'var2' : u'variable2', }) self.response.out.write(template_object.render(template_values)
としてあげれば出来そうな感触を得ました。
しかし、これをやると
AssertionError: settings has not been configured in this thread
というエラーが発生してしまいました。
Tracebackを見ると、
template_object = template.Template(template_string) File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/_internal/django/template/__init__.py", line 156, in __init__ if settings.TEMPLATE_DEBUG and origin is None: File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/_internal/django/conf/__init__.py", line 31, in __getattr__ assert self.holder, 'settings has not been configured in this thread'
とあり、どうやら「Djangoの環境設定settingsにTEMPLATE_DEBUGの設定がないよ」ということのようでしたので、
from google.appengine._internal.django.conf import settings settings.configure( TEMPLATE_DEBUG = True, )
としてあげたところ期待したとおりに画面が描画されました。
とは言え、テンプレートにデータストアから取得してきた文字列を使った場合、ファイルパスというものがありませんから、{% extends "path" %}や{% include "path" %}といったDjangoテンプレートエンジンの機能が使えません(pathが見つからないと無視され、何も出力しないようです)
継承やインクルードが使えないのではとても不便ですから、次はこのあたりを解決しなければならないのですが、これに関しては現時点でどう解決すればよいのか、皆目見当がついていません。
どなたか良い方法を教えていただけると助かります。
(そもそも、Djangoテンプレートエンジンをこういう風に使うのが間違い?)