Bottle py и глобальная переменная Jinja2

Я использую фреймворк Bottle.py вместе с шаблонами Jinja2 в новом приложении.

Всякий раз, когда пользователь входит в приложение, я хотел бы добавить новую глобальную переменную Jinja2 с именем активного пользователя, поэтому в частичном шаблоне (заголовке) я могу отобразить это имя.

В моем файле python (бутылки) я пробовал несколько вещей в соответствии с тем, что я до сих пор гуглил, но пока безуспешно.

Это последнее, что я пробовал внутри функции:

import jinja2
env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates'))
env.globals['myglobal'] = 'My global'
#env.globals.update({'myglobal': 'My global'})

Но при размещении этого в шаблоне заголовка: {{myglobal}} он просто не отображается.

Поскольку это мой первый раз с бутылкой и jinja2, кто-нибудь знает, как этого добиться?


person Roland Pish    schedule 17.01.2015    source источник


Ответы (3)


В этом случае вам нужно использовать хук before_request, как показано ниже:

from bottle import Jinja2Template

@hook('before_request')
def before_request():
    Jinja2Template.defaults['myglobal'] = 'My global'
person GBlach    schedule 29.08.2015
comment
Не уверен, что вы хотите выполнять это на каждом request. Решение, предложенное @DanGayle, мне кажется лучше. - person Doomsday; 28.07.2016

У меня есть аналогичная настройка, и это работает для меня, используя BaseTemplate, встроенный в бутылку:

from bottle import BaseTemplate
BaseTemplate.defaults['myglobal'] = 'My global'
person Dan Gayle    schedule 17.11.2015
comment
Мой ответ был решением фактического вопроса с использованием переменных, которые оператор использовал в своем вопросе. Пожалуйста, не переписывайте его во что-то совершенно другое, хотя этот ответ может быть правильным, это не мой ответ. - person Dan Gayle; 09.08.2016
comment
Ну, я нигде не вижу в вопросе BaseTemplate, и вопрос специфичен для Jinja2. Я только отредактировал ваш ответ, чтобы попытаться помочь другим. Если это ваша воля, чтобы так и осталось, то я не возражаю. - person tleb; 12.08.2016

from bottle import Jinja2Template
Jinja2Template.defaults['foo'] = 'bar'

Это нужно для добавления переменной к каждому отображаемому шаблону jinja2. Если вы хотите добавить фильтр, вот что я сделал:

import functools
from bottle import jinja2_view

def foo():
    return 'bar'
view = functools.partial(jinja2_view, template_settings={
    'filters': {'foo': foo}})

Вы можете установить любые настройки jinja2, используя это.

person tleb    schedule 13.08.2016