Как получить список текущих переменных из шаблона Jinja 2?

Кроме того, вы можете использовать «& amp;» чтобы запускать много процессов через одно (1) ssh-соединения, чтобы поддерживать минимальное количество терминалов. Например, у меня есть один процесс, который прослушивает сообщения для извлечения файлов, второй процесс прослушивает сообщения для загрузки файлов: используя «& amp;» Я могу запускать обе службы в одном терминале через одно подключение ssh к моему серверу. ***** Я только понял, что эти процессы проходят через "& amp;" также будет «оставаться в живых» после закрытия сессии ssh! довольно аккуратно и полезно, если ваше соединение с сервером прерывается **

24
задан Christian 3 August 2010 в 17:02
поделиться

2 ответа

Технически, поскольку контекст не передается как именованный словарь, требуется небольшая работа для создания списка переменных контекста изнутри шаблона. Хотя это возможно.

  1. Определите контекстную функцию Jinja , чтобы вернуть объект jinja2.Context, который по сути является словарем глобальных переменных / функций

  2. Сделайте эту функцию доступной в глобальном пространстве имен; т.е. глобальный словарь jinja2.Environment или jinja2.Template

  3. При желании можно отфильтровать объекты из контекста; например, используйте callable () , чтобы пропустить глобальные вспомогательные функции Jinja по умолчанию (диапазон, объединение и т. д.). Это можно сделать в контекстной функции или в шаблоне; везде, где это имеет наибольший смысл.

Пример:

>>> import jinja2
>>> 
>>> @jinja2.contextfunction
... def get_context(c):
...         return c
... 
>>> tmpl = """ 
... {% for key, value in context().items() %}
...     {% if not callable(value) %}
...         {{ key }}:{{ value }}
...     {% endif %}
... {% endfor %}
... """
>>> 
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>> 
>>> print(template.render(**context))
        a:1
        c:3
        b:2

[Или вызовите render_response с помощью ('home.htm', context = context) , чтобы другое решение заработало.]

36
ответ дан 28 November 2019 в 23:42
поделиться

Я нашел ответ @Garrett быть немного более сложным, чем, что я хотел. Я нашел, что могу легко осмотреть контекст путем добавления клона контекста к самому контексту:

contextCopy = dict(context)
context['all'] = contextCopy

И затем симпатичная печать это в мой шаблон Jinja с <pre>{{ all|pprint }}</pre>.

0
ответ дан 28 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

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