Flask:请求变量中的当前页面

70

在模板中,我如何获得当前页面信息?我不想传递像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> 
6个回答

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

6
请注意,对于其他变量来说,这并不正确。这是因为request是默认插入模板上下文中的变量之一 - Marcel M

66

使用request.path似乎不是一个合适的方法,因为在更改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>

祝你好运!


7
这是正确的答案。其他答案使用硬编码路径,这是一个非常糟糕的想法。 - Nathan Osman
2
只有在页面的每个部分使用一个路由时,此方法才有效。否则,它将不符合您的要求。 =\ - flamusdiu
1
不,那不是真的。你可以在端点名称中加入一些结构(比如 blueprint.subsection.page),然后使用.startswith('blueprint.subsection.')进行比较。这只是一个例子。 - negus

50
首先在你的应用程序中从flask导入request模块,然后你可以在不将其传递给模板的情况下使用它:
<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>

2
已将request导入(到*.py文件中),但仍然出现错误:jinja2.exceptions.UndefinedError: 'request'未定义。 - Pavel Vlasov

11

为避免使用硬编码的URL,您可以像这样使用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 %}
在这种情况下,索引index、foo、bar和baz将是函数名称,在您的Python代码中像这样使用:
@app.route('/')
def index():

5

请尝试

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

这对我有效。

1

如果你的URL中还有其他内容,你也可以使用.split

例如:

/product
/product/add
/product/32432/edit
/product/32432/view

{{ request.path.split('/')[1] }}

这将仅返回“product”。


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