#python #flask
#python #flask
Вопрос:
Я создал панель навигации в приложении flask, расположенном в HTML-файле, который распространяется на все остальные файлы. На панели навигации у меня есть этот код:
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">Home</a>
</li>
{% if 'user' in session %}
<li class="nav-item">
<a class="nav-link" href="/signup">Sign Up</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/login">Login</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="/logout">Logout</a>
</li>
{% endif %}
</ul>
У меня есть элемент словаря ‘user’, сохраненный в сеансе flask, который я хочу иметь возможность отправлять в base.html страница. На других страницах я использую {% extends "base.html" %}
для получения панели навигации, но если я хочу передать переменную sessions, мне придется отправить ее через оба base.html файл и другой файл, который его расширяет. Есть ли способ обойти это?
Ответ №1:
То, что вы ищете, — это контекстный процессор. Добавьте эту функцию в тот же файл, где у вас есть функция просмотра @app.route(‘/’), и все переменные, которые вы загружаете в словарь template_config ниже, будут доступны в любом из ваших файлов template .html.
# Global HTML template variables.
@app.context_processor
def set_global_html_variable_values():
if session.get('user'):
user_in_session = True
else:
user_in_session = False
template_config = {'user_in_session': user_in_session}
return template_config
(base.html file)
{% if user_in_session %}
<li class="nav-item">
<a class="nav-link" href="/signup">Sign Up</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/login">Login</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="/logout">Logout</a>
</li>
{% endif %}
Комментарии:
1. Это хорошо для общего случая. В моей ситуации я просто хотел, чтобы он показывал некоторые элементы панели навигации, если переменная была true. Мне действительно просто нужно.d установить {%, если ‘name’ не в сеансе %} . Ничего не нужно передавать
2. Я обновил приведенный выше код, чтобы показать, как можно использовать контекстный процессор для предоставления вам логической переменной, которую вы затем можете использовать в своем base.html шаблонная логика.
3. Я думаю, что переменная сеанса передается автоматически, поэтому ее не нужно объявлять. В моем main.py , я обнаружил, что мне не нужно передавать какие-либо переменные.
4. Я думаю, что код действительно работал, просто я не установил для оператора if значение not.
5. Хорошая сделка! Я забыл о том, что сеанс автоматически доступен в шаблонах.