从python模块加载Jinja模板(预编译模板)

从python模块加载Jinja模板(预编译模板),第1张

概述我在App Engine上使用 Python 2.5并试图让Jinja2 ModuleLoader工作. 要初始化我使用的环境: @staticmethod # get Jinja environment (global)def get_new(): 我在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 divisionfrom jinja2.runtime import LoopContext,TemplateReference,Macro,Markup,TemplateRuntimeError,missing,concat,escape,markup_join,unicode_join,to_string,IDentity,TemplateNotFoundname = 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扩展名的模板.

解决方法 更新:使用我用于CMS的代码查看此Gist:

https://gist.github.com/voscausa/9154936

更新:现在我使用的是Python 27,并且能够创建一个模块加载器,它可以从包或数据库加载jinja编译模板(python代码)(package = None).

要初始化加载器,您可以使用:

from jinja2 import EnvironmentEnvironment(auto_reload=False,loader = moduleloader.fileSystemModuleLoader(package))class ModuleLoader(object):    """Base mixin class for loaders that use pre-parsed Jinja2 templates stored    as Python code.    """    def get_module(self,environment,template):        raise TemplateNotFound(template)    def load(self,filename,j_globals=None):        """Loads a pre-compiled template,stored as Python code in a template        module.        """        if j_globals is None: j_globals = {'environment' : environment}        t = object.__new__(environment.template_class)        module = self.get_module(environment,filename)        name,blocks,root,deBUG_info = module.run(environment,t)   # module run function              t.environment = environment        t.globals = j_globals        t.name = name        t.filename = filename        t.blocks = blocks        # render function and module        t.root_render_func = root        t._module = None        # deBUG and loader helpers        t._deBUG_info = deBUG_info        t._uptodate = lambda: True        return tclass fileSystemModuleLoader(ModuleLoader):    def __init__(self,package = None):   # load module from package or datastore        self.package = package            # package = "compiled" or package = None    def get_module(self,template):        # Convert the path to a module name        name = template.replace('.HTML','').replace('.txt','').replace('/','.')   # NO extensions           module = None        if self.package == None :            if name in sys.modules : return sys.modules[name]            logging.info('load module : ' + name)      # load module from runtimes db            try :                runtime = models.Runtimes.get_by_key_name(template)                module_code = db.Text(runtime.compiled)                                                 module = imp.new_module(name)                exec module_code in module.__dict__                                                         sys.modules[name] = module             # add to sys modules,so no import                return module            except (importError,AttributeError):                logging.error('load Failed : ' + name)        else :                                         # load module from package            logging.info('load module : ' + name + ' from package : ' + self.package)            try:                 mod_import = __import__(self.package,globals(),None,[str(name)])                module = getattr(mod_import,name)                return module            except (importError,AttributeError):                logging.error('load Failed : ' + name)        raise TemplateNotFound(template)
总结

以上是内存溢出为你收集整理的从python模块加载Jinja模板(预编译模板)全部内容,希望文章能够帮你解决从python模块加载Jinja模板(预编译模板)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1196582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存