Я использую Python 2.5 в App Engine и пытался заставить работать ModuleLoader Jinja2.
Для инициализации среды я использую:
@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()
Полученный код выглядит нормально.Есть идеи?Я надеюсь, что вы можете мне помочь.Эта статья Родриго Мораеса показывает, что загрузка шаблонов из модулей 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.