Flask как получить переменную в расширенном шаблоне

#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. Хорошая сделка! Я забыл о том, что сеанс автоматически доступен в шаблонах.