我能否呈现一个jinja2模板,它是blob/blobstore而不是GAE/Python中的文件?

2024-03-29 13:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

++++见底部的解决方案(第二次更新)++++

我是谷歌应用引擎和Python的新手。在

我有许多jinja2模板(它们是通过编程生成的)被存储为blob(因为GAE不允许程序写入文件)。我现在想呈现这些blob模板,但不知道如何在render语句中引用它们。在

如果需要,我可以将这些模板存储在blobstore中。在

如有任何建议,将不胜感激。这样一个呈现语句的示例将是超级的。在

(我将Django包含在标记中,因为我怀疑引用Django的模板可能与此类似。)

谢谢你的帮助。在

在++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++修改了问题后续尝试使用变量作为jinja2的模板源++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 我试图让它与TextProperty字段一起工作,并做了一个简单的测试(假设我已经检索到文本字段),如下所示:

FileTxt = '<html><body><br /><br /><p>The first test value starts here {{val1}}.  And {{val2}} is the 2nd test value.</p></body></html>'
val1 = 'H value 1 H'
val2 = 'H second value H'
self.render_template(FileTxt, {'val1': val1, 'val2': val2})       

这将返回“无效文件名”错误。在

我注意到它试图打开文件…\templates\。。。在

我想我必须以某种方式修改以下内容。在

^{pr2}$

我该如何修改它,使其在变量中而不是在文件中使用模板?或者我还需要做些什么才能使无文件版本工作?在

谢谢。在

在++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++以下是有效的!谢谢你们两个!++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++在

class TextFileRender(BaseHandler):
    def get(self):
        val1 = 'H value 1 H'
        val2 = 'H second value H'
        env = jinja2.Environment(loader=jinja2.FunctionLoader(loader))
        self.render_template(env.get_template('y'), {'val1': val1, 'val2': val2})

然后我在一个单独的.py文件中添加了加载程序(不知道为什么我总是要在一个单独的文件中调用函数,然后添加到import中)

def loader(x):
    r = '<html><body><br /><br /><p>The first test value starts here {{val1}}.  And {{val2}} is the 2nd test value.</p></body></html>'
    return r

上面的方法是有效的。但现在我的问题是,一个变量中的html内容扩展了另一个html模板(也存储在数据存储中)。我可以在html({%extends)主控形状中生成extends语句吗_模板.html“%})某种程度上像{%扩展nv.get_模板('master_template')%}?在

再次感谢你的帮助。在


Tags: 文件testbrself模板jinja2getvalue
3条回答

是的,你可以。但是您也可以在数据存储中存储HTML模板和其他信息。我使用内容=数据库文本属性()以存储此HTML。在

关于模板继承的问题。答案是:当你实现一个函数加载器时,它将被调用两次。首先是子模板,然后是基模板。 为此,你必须更换装载机。现在它加载一个固定的HTML字符串。参数x包含模板的名称。明白了吗? 顺便说一句:当您使用jinja includes时,函数加载器也将被调用

您可以将模板数据存储在任一位置(blobstore、datastore),并且解决方案是相同的。普通的jinja2装载器是一个FileSystemLoader。您应该尝试类似于FunctionLoader,并从获取的blobstore(或数据存储)项返回值。在

例如:

def loader(blob_key):
    r = blobstore.BlobReader(blob_key)
    return r.read()

env = jinja2.Environment(loader=jinja2.FunctionLoader(loader))

rendered_template = env.get_template('some blob key').render({'k': 'v'})

当然,您应该使用某种缓存(local,memcache),而不是每次从blobstore中获取数据。在

相关问题 更多 >