Как вызвать функцию Python в шаблоне Jinja и использовать возвращенный словарь из значений функций? - PullRequest
1 голос
/ 23 апреля 2019

У меня есть функция, которая читает из файла и возвращает словарь d {1: 'a', 2: 'b', 3: 'c'}.

Я хочу отправить эту функциюв шаблон и иметь возможность вызывать эту функцию в моем шаблоне jinja.

Когда я вызываю эту функцию в своем шаблоне Jinja, я хочу иметь возможность использовать возвращенные значения словаря в шаблоне.Я планирую использовать AJAX для постоянного вызова этой функции в шаблоне, чтобы при изменении данных в файле, например, 1: «a» на 1: «f», непрерывные вызовы функций в шаблоне обновляли словарь, которыйиспользуется в шаблоне.

Функция, которая извлекает данные из файла, называется getdata (), которая возвращает словарь данных.

Я знаю, что вы можете использовать .context_processor, чтобы сделатьфункция глобальная и использовать возвращаемое значение в шаблоне.

@app.context_processor
def utility_processor():
def format_price(amount, currency=u'$'):
  return u'{1}{0:.2f}'.format(amount, currency)
return dict(format_price=format_price)

, а затем вы можете вызвать его в своем шаблоне следующим образом.

{{ format_price(0.33) }}

, который выдает $ 0,33

Можно ли достичь чего-то вроде отправки функции в шаблон и возможности вызова обработчика контекста для доступа к определенному значению в возвращенном словаре в шаблоне?Примерно так:

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

@app.context_processor
def context_processor():
    return dict(datadict=getdata())

Получите доступ к первому ключу в словаре следующим образом.

{{ datadict.1 }}

, который выведет «a».

Возможно ли что-то подобное

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Вы можете создать свой собственный фильтр :

from jinja2 import Environment

d = {1: 'a', 2: 'b', 3: 'c'}

env = Environment()
env.filters["myfilter"] = lambda k: d[k]

template = env.from_string("{{ val | myfilter }}")
print(template.render(val = 3))

отпечатки

c
0 голосов
/ 23 апреля 2019

Да, посмотрите на Python объекты контекста .Я рекомендую использовать фреймворк, такой как django или flask, чтобы вам было проще доставлять данные с вашего сервера клиенту.Если вы пойдете по этому маршруту, вы сможете перенести данные на клиентскую сторону просто

@app.route('/')
def index():
data: {}
return render_template('index.html', data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...