在jinja中,你把变量存储在哪里?

19

我有五个具有相同页面布局和结构但颜色、文本等方面不同的页面,所以这是模板化的理想环境。我决定使用Jinja2和可能的flask。我已经阅读了文档和一些在线教程,这些教程很多讲解了如何在页面上使用模板,但没有太多关于如何向页面发送变量的信息。

  • 您将页面特定变量存储在哪里?
  • 代码如何知道请求的是哪个页面以及要加载哪些变量?

1
Flask是一个不错的选择。它的教程或多或少地回答了你的问题:http://flask.pocoo.org/docs/quickstart/#rendering-templates 。还要注意@app.route如何定义URL。 - 9000
谢谢 - 所以我会为每个页面编写一个Python脚本,在每个Python脚本中声明变量,然后将它们传递给template.render吗? - Kevin Burke
2个回答

48

以下是基本用法:

首先创建一个模板

>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')

然后传入变量进行渲染

>>> template.render(name='John Doe')
u'Hello John Doe!'

通常情况下,你会希望从文件中加载模板而不是从代码中加载。这样更高效、更优化,还允许使用模板继承:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))

这将在Python路径中已安装的yourapplication Python包的templates文件夹内寻找模板。您也可以使用其他加载器从特定文件系统或其他位置加载。

然后,您可以加载一个模板:

template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')

使用 Flask 时,所有配置都已为您准备好,所以您可以直接使用 Flask 的 render_template 函数,并且它会自动查找应用程序中的 templates 子文件夹:

from flask import render_template

@app.route('/hello/')
def hello(name=None):
    return render_template('hello.html', name=name)

请注意传递给render_template的模板变量(也称为上下文)。

Jinja有非常好的文档。请阅读它。如有进一步问题,请随时提出。


1

一些没有任何解释的链接是没有帮助的,我给你打负分。 - jwbensley
@jwbensley 噢,因为禁用了复制粘贴功能所以不太有帮助?这里有一个解释:阅读...但是你的反对票也是合理的,因为我可能有点懒或者匆忙(记不清了)。 - StefanNch
仅仅粘贴一堆链接会导致链接失效,这已经显而易见,因为你现在标记了其中一个链接为失效。 - jwbensley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接