【发布时间】:2012-03-14 11:06:47
【问题描述】:
我在 App Engine 上使用 Python 2.5 并尝试让 Jinja2 ModuleLoader 工作。
初始化我使用的环境:
@staticmethod # get Jinja environment (global)
def get_new(): # and initialize Jinja environment
if myEnv._my_env == None :
path = os.path.join(os.path.dirname(__file__), 'compiled')
myEnv._my_env = Environment(loader = ModuleLoader(path))
return myEnv._my_env
'compiled' 是我的 GAE 项目中的一个目录。 但是我一直收到 TemplateNotFound 异常??
我使用以下方法编译了模板:
env = Environment(extensions=['jinja2.ext.i18n'])
env.filters['euros'] = Euros
db_runtimes = Runtimes.all() # the html templates saved in a db.Blob
for each in db_runtimes.fetch(999) :
key = each.key().name()
source = db.Blob(each.content).decode('utf-8')
name = key.split('.')[0]
raw = env.compile(source, name=name, filename=name + '.py', raw=True)
each.compiled = db.Blob(raw.encode('utf-8')) # compile and save the .py
each.put()
生成的代码看起来不错。有任何想法吗? 我希望你能帮助我。 Rodrigo Moraes 的这篇文章展示了从 python 模块加载模板的速度非常快。但在这个 2009 年的概念证明中,他“破解”了 Jinja 代码,以便能够运行该代码。我认为 ModuleLoader 应该做同样的工作。 https://groups.google.com/group/pocoo-libs/browse_thread/thread/748b0d2024f88f64
testmod.py 看起来像这样:
from __future__ import division
from jinja2.runtime import LoopContext, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join, to_string, identity, TemplateNotFound
name = u'testmod.py'
def root(context, environment=environment):
if 0: yield None
yield u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n<title>TEST</title>\n</head>\n<body>\n\t<p>test template</p>\n</body>\n</html>'
blocks = {}
debug_info = ''
还有页面处理程序:
def get(self):
my_env = myEnv.get()
page = 'testmod.py'
template = my_env.get_template(page)
self.response.out.write(template.render({}))
我也尝试获取不带 .py 扩展名的模板。
【问题讨论】:
-
被编译/指定为 app.yaml 中的 static_dir?
-
编译为Python包,不需要app.yaml中的handler。
标签: python google-app-engine jinja2