1

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

我是 Google App Engine 和 Python 的相对新手。

我有许多 jinja2 模板(以编程方式生成),它们存储为 blob(因为 GAE 不允许程序写入文件)。我现在想渲染这些 blob 模板,但我不知道如何在渲染语句中引用它们。

如果需要,我可以将这些模板存储在 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\...

我怀疑我必须以某种方式修改以下内容。

TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'templates')
jinja_environment = \
    jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATE_DIR))

我将如何修改它以使其与变量而不是文件中的模板一起使用?或者我还需要做什么才能使无文件版本工作?

谢谢。

++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !感谢你们俩!++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++

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 文件中添加了加载器(不知道为什么我总是必须有我想在一个单独的文件中调用然后添加到导入的函数)

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 "master_template.html" %}) 中以某种方式使扩展语句类似于 {% extends nv.get_template('master_template') %} 吗?

再次感谢你的帮助。

4

3 回答 3

4

您可以将模板数据存储在任一位置(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'})

您当然应该使用某种缓存(本地、内存缓存),而不是每次都从 blobstore 中获取。

于 2012-09-19T19:44:01.957 回答
1

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

于 2012-09-20T16:56:30.703 回答
0

是的你可以。但您也可以在数据存储中存储带有附加信息的 HTML 模板。我使用 content = db.TextProperty() 来存储这个 HTML。

于 2012-09-19T17:35:12.640 回答