Задать вопрос
@Pythonist

Как можно передать один раз значение в base.html для показа на всем сайте во Flask?

Привет. У меня есть код base.html.

<html>
    <head>
    </head>
    <header>Your balance: {{ balance }}</header>
<body> 
{% block content %}
{% endblock %}
</body>
</html>


и views.py

@app.route("/")
def index():
    balance = User.query.get(...)
    return render_template('index.html',
    balance = balance)

@app.route("/settings")
def settings():
    balance = User.query.get(...)
    return render_template('settings.html',
    balance = balance)

@app.route("/exchange")
def exchange():
    balance = User.query.get(...)
    return render_template('exchange.html',
    balance = balance)


и т.д, много страниц. Где я в каждой функции передаю одно и то же - balance.

{{ balance }} -он должен отображаться на всех страницах, где включен этот base.html

Для этого мне нужно передать объект баланса в каждую функцию для каждой страницы. Как сделать так, чтобы я мог передавать его только один раз для всех страниц? А не в каждой функции писать balance и передавать в рендер? Т.к баланс юзера должен быть показан на каждой странице сайте с этим base.html
  • Вопрос задан
  • 235 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
gedev
@gedev
сисадмин-энтузиаст
Ответ нашёлся в документации. Можно использовать процессоры контекста.
Функции и переменные переданные через процессор контекста становятся доступны в шаблоне.

В коде ниже переменная balance передаётся через функцию get_balance(). В шаблоне нет необходимости что-то менять. Обрати внимание, что и переменные и функции возвращаются в виде словаря (dict()).

app.py:

from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.context_processor
def get_balance():
    balance = '10'
    return dict(balance=balance)

@app.route('/')
def index():
    return render_template('page.html')

if __name__ == '__main__':
    app.run()
Ответ написан
Комментировать
Revencu
@Revencu
@app.before_request
def before_request():
    g.balance = User.query.get(...)


В base.html используйте {{g.balance}}
Не забывайте подключать обьект g во всех темплейтах
from flask import g
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы