Flask: текущая страница в переменной запроса

Как в шаблоне узнать, на какой странице я сейчас нахожусь? Я бы предпочел не передавать такую ​​переменную, как 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> 

person atp    schedule 30.12.2011    source источник


Ответы (6)


Пока вы импортировали request, request.path должна содержать эту информацию.

person ranksrejoined    schedule 30.12.2011
comment
Обратите внимание, что это неверно для других переменных. Это работает, потому что request является одной из переменных, вставленных по умолчанию в контекст шаблона. - person Marcel M; 25.03.2013

Использование 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>

Удачи!

person negus    schedule 29.07.2014
comment
Это правильный ответ. Другие используют жестко заданные пути, что является очень плохой идеей. - person Nathan Osman; 09.12.2014
comment
Это работает, только если вы используете один маршрут для каждого раздела страницы. В противном случае это будет не то, что вы ищете. знак равно - person flamusdiu; 28.05.2015
comment
Нет, это не так. Вы можете иметь некоторую структуру в именах ваших конечных точек (например, blueprint.subsection.page) и выполнять сравнение, используя .startswith('blueprint.subsection.'). Просто пример. - person negus; 29.05.2015

Первый запрос на импорт из фляги в вашем приложении. Затем вы можете использовать его, не переходя к шаблону:

<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>
person Sosiska    schedule 03.01.2012
comment
request импортировано (в файл *.py), все еще возникает ошибка: jinja2.exceptions.UndefinedError: «запрос» не определен - person Pavel Vlasov; 10.02.2018

Чтобы избежать использования жестко закодированных 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():
person MoepMan    schedule 14.03.2016

Пытаться

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

Этот работал на меня.

person iChux    schedule 16.07.2015

Вы также можете использовать .split, если в вашем URL есть что-то еще.

Пример:

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

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

Это вернет только "продукт"

person Iaron    schedule 01.09.2019