我可以呈现一个blob/blobstore而不是GAE/Python中的文件的jinja2模板吗?

我可以呈现一个blob/blobstore而不是GAE/Python中的文件的jinja2模板吗?,python,google-app-engine,jinja2,Python,Google App Engine,Jinja2,++++请参阅底部的解决方案(第二次更新)++++ 我是谷歌应用程序引擎和Python的新手 我有许多jinja2模板(通过编程生成)存储为blob(因为GAE不允许程序写入文件)。现在我想呈现这些blob模板,但我不知道如何在render语句中引用它们 如果需要,我可以将这些模板存储在blobstore中 如有任何建议,将不胜感激。这样一个render语句看起来是什么样子的示例将是super (我已经将Django包含在标记中,因为我怀疑引用Django的模板可能与之类似。) 谢谢你的帮助 +

++++请参阅底部的解决方案(第二次更新)++++

我是谷歌应用程序引擎和Python的新手

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

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

如有任何建议,将不胜感激。这样一个render语句看起来是什么样子的示例将是super

(我已经将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})       
我该如何修改它,使其与变量中的模板而不是文件中的模板一起工作?或者我还需要做些什么才能使无文件版本正常工作

谢谢

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++以下是工作!谢谢你们两个++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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加载器(x):
r='

第一个测试值从这里开始{{val1}}。{{val2}}是第二个测试值。

' 返回r
上述措施正在发挥作用。但现在我的问题是,一个变量中的html内容扩展了另一个html模板(也存储在数据存储中)。我是否可以使html({%extends“master_template.html”%})中的extends语句类似于{%extends nv.get_template('master_template')%}


再次感谢您的帮助。

是的,您可以。但是,您也可以在数据存储中存储包含附加信息的HTML模板。我使用content=db.TextProperty()来存储此HTML。

可以。但是,您也可以在数据存储中存储包含附加信息的HTML模板。我使用content=db.TextProperty()来存储此HTML。

您可以将模板数据存储在任意位置(blobstore、datastore),解决方案是相同的。正常的jinja2加载程序是
文件系统加载程序
。您应该尝试类似的方法,并从获取的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获取模板数据。

您可以将模板数据存储在任意位置(blobstore,datastore),解决方案是相同的。正常的jinja2加载程序是
文件系统加载程序
。您应该尝试类似的方法,并从获取的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获取数据。

您关于模板继承的问题。答案是:当你实现一个函数加载器时,它会被调用两次。首先用于子模板,然后用于基础模板。 为此,您必须更改加载程序。现在它加载一个固定的HTML字符串。参数x包含模板的名称。清楚的
顺便说一下:当您使用jinja时,也会调用函数加载器,包括您关于模板继承的问题。答案是:当你实现一个函数加载器时,它会被调用两次。首先用于子模板,然后用于基础模板。 为此,您必须更改加载程序。现在它加载一个固定的HTML字符串。参数x包含模板的名称。清楚的
顺便说一下:当您使用jinja includes时,也会调用函数加载器,谢谢您的快速响应。这是个好消息!如何让jinja2模板呈现程序从return render语句获取模板,从blobstore或数据存储(或从数据存储检索的变量)获取模板?谢谢。我不知道我是否理解你的问题是正确的。但是您可以从数据库中读取html模板,并从字符串中呈现html模板。环境。从字符串(“此处的模板文本”)或创建函数加载器。感谢您的快速响应。这是个好消息!如何让jinja2模板呈现程序从return render语句获取模板,从blobstore或数据存储(或从数据存储检索的变量)获取模板?谢谢。我不知道我是否理解你的问题是正确的。但是您可以从数据库中读取html模板,并从字符串中呈现html模板。我更喜欢使用数据存储(textproperty)来存储动态HTML文件。使用NDB数据存储API,您可以使用自动缓存。我同意。我讨论blobstore是因为问题的注释。我试图使它与textproperty一起工作。请看修改后的问题。我收到一个错误,因为它仍在查找文件。谢谢。它起作用了——谢谢你们两位!这需要一点尝试和错误,但它正在工作。见编辑后的问题。现在我遇到了一个相关的问题,即如何使模板文本中的extends语句也引用数据库记录。也许我应该把这作为一个单独的问题发布。我更喜欢使用数据存储(
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'})