2011-12-30 51 views
49

在模板中,我如何获取当前所在的页面?我宁愿不通过像page这样的变量,特别是当我知道一些request.xxx可以提供给我这些信息时。烧瓶:请求变量中的当前页面

<li {% if page=="home" %}class="active"{% endif %}>     
    <a href="/">Home</a>             
</li>                 
<li {% if page=="about" %}class="active"{% endif %}>     
    <a href="/about">About</a>           
</li> 

回答

50

只要你已经导入requestrequest.path应该包含这些信息。

+3

请注意,这不适用于其他变量。它的工作原理是'request'是默认插入的变量之一(http://flask.readthedocs.org/en/latest/templating/#standard-context)到模板上下文中。 – 2013-03-25 14:39:43

42

在您的应用程序中首次从烧瓶导入请求。然后,你可以使用它没有传递到模板:

<li {%- if request.path == "/home" %} class="active"{% endif %}> 
    <a href="/">Home</a> 
</li> 
<li {%- if request.path=="/about" %} class="active"{% endif %}> 
    <a href="/about">About</a> 
</li> 
+0

'request'导入(到'* .py'文件中),仍然出现错误:jinja2.exceptions.UndefinedError:'request'未定义 – 2018-02-09 21:15:24

36

使用Request的似乎并不是一个正确的做法,因为你必须在改变URL规则或部署在您的网站的情况下,更新的路径一个子文件夹。

使用request.url_rule.endpoint相反,它包含独立的实际路径的实际终点名称:

(Pdb) request.url_rule.endpoint 
'myblueprint.client_pipeline' 

在模板中:

<li {% if request.url_rule.endpoint == "myblueprint.client_pipeline" %}class="active"{% endif %}>Home</li> 

祝你好运!

+4

这是正确的答案。其他人使用硬编码路径,这是一个非常糟糕的主意。 – 2014-12-09 19:53:38

+1

这只适用于您在页面的每个部分使用一条路线。否则,这不会是你正在寻找的。 = \ – flamusdiu 2015-05-28 02:22:11

+0

不,这是不正确的。您可以在端点名称中使用某种结构(如blueprint.subsection.page),并使用.startswith('blueprint.subsection。')进行比较。只是一个例子。 – negus 2015-05-29 03:25:37

3

尝试

<li {% if request.endpoint == "blueprintname.routename" %}class="active"{% endif %}>Home</li> 

这一个为我工作。

1

要避免使用硬编码的网址,你可以使用url_for功能是这样的:

{% for ni in ['index', 'foo', 'bar', 'baz'] %} 
<li {%- if request.path == url_for(ni) %} class="active"{% endif %}><a href="{{ url_for(ni) }}">{{ ni | capitalize }}</a></li> 
{% endfor %} 

在这种情况下,指数,富,酒吧和巴兹将是函数名,在你的Python代码中使用这样的:

@app.route('/') 
def index():