Jinja: Реализовать встроенный помощник шаблона для вывода доступных переменных шаблона.

Созданный на 17 янв. 2013  ·  16Комментарии  ·  Источник: pallets/jinja

Механизм шаблонов Smarty имеет очень удобную встроенную {отладку} , которая дает краткий обзор переменных, доступных для дизайнера.

Smarty_debug_console

Было бы неплохо иметь то же самое в Jinja2 по умолчанию.

Самый полезный комментарий

image

Как просили. Вы увидите, что содержимое организовано (и отсортировано) по контекстным переменным, фильтрам и тестам. Кроме того, вот увеличенный вид экрана с еще несколькими «интересными» переменными контекста. Посмотрите, как предела depth=3 достаточно, чтобы показать немного деталей, не подвергая себя возможности чрезмерно вложенного вывода, поскольку, я считаю, наиболее востребованной вещью является точное знание того, какие контекстные переменные (верхнего уровня) присутствуют, а не полная глубина любых конструкций:

image

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

Все 16 Комментарий

Я должен проверить, но я думаю, что это должно работать:

<h2>locals()</h2>
<pre>{{ locals() }}</pre>
<h2>globals()</h2>

... https://stackoverflow.com/questions/3398850/how-to-get-a-list-of-current-variables-from-jinja-2-template

@mitsuhiko из https://stackoverflow.com/a/13757358/188833 :

import jinja2

@jinja2.contextfunction
def get_context(c):
 return c

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable

для отладки, например, pyrum_debugtoolbar может отображать контекст шаблона, если функция просмотра - соответствующим образом абстрагированная IMHO - просто возвращает объект контекста (например, dict, OrderedDict)

вариант использования

Мой вариант использования здесь - передача нескольких аргументов из утилиты CLI в шаблон jinja2 (где я хотел бы определить значения по умолчанию в шаблоне (например, для Dockerfiles (без autoescape , всего))

Что я хотел бы сделать, это

{% set ENVVAR=context.get('ENVVAR', 'DEFAULT') %}

но, увы, реальный объект context [...]

@westurner , так это работает? Я не могу проверить это прямо сейчас, но мне кажется, что {{ locals() }} должен дать сбой, если он содержит неконвертируемые байты.

  • json.dumps(locals()) не будет работать без пользовательского JSONEncoder (например, с repr() для [объектов кода])
  • может pprint.pformat(locals()) ? (это было бы удобным встроенным)
  • ... autoescape=True предотвратит XSS

Это было бы благом при расширении шаблонов стороннего приложения. В настоящее время я использую hieroglyph для создания слайд-шоу, основанного на sphinx и, таким образом, Jinja2.

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

Возможность просто вывести все доступные переменные прямо из шаблона (то есть без изменения какого -либо кода Python) сделала бы это намного быстрее и проще. Итак, допустим, было бы неплохо сделать что-то вроде этого:

{% extends "!layout.html %}

{# ... or any other sensible name #}
{% dump_variables() %}

{% block body %}
Hello World!
super()
Goodbye World
{% endblock %}

Таким образом, я мог проанализировать все, что предлагает мне иероглиф, при разработке новой темы.

Для этой цели я создал расширение, его можно найти по адресу https://github.com/niwinz/django-jinja/files/1607805/jinja_extensions.py.txt .

@ShaheedHaque какие-нибудь экраны?

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

6 января 2018 г., 02:23, «анатолий техтоник» [email protected] написал:

@ShaheedHaque https://github.com/shaheedhaque есть скрины?


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/pallets/jinja/issues/174#issuecomment-355716273 или отключить звук
нить
https://github.com/notifications/unsubscribe-auth/AEp7KdBBslHJPIGp5VliuF74bxSZTk-wks5tHtkEgaJpZM4AXefd
.

Экран @ShaheedHaque было бы неплохо сравнить с выводом Smarty из первого поста.

image

Как просили. Вы увидите, что содержимое организовано (и отсортировано) по контекстным переменным, фильтрам и тестам. Кроме того, вот увеличенный вид экрана с еще несколькими «интересными» переменными контекста. Посмотрите, как предела depth=3 достаточно, чтобы показать немного деталей, не подвергая себя возможности чрезмерно вложенного вывода, поскольку, я считаю, наиболее востребованной вещью является точное знание того, какие контекстные переменные (верхнего уровня) присутствуют, а не полная глубина любых конструкций:

image

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

Выглядит полезно. Так почему бы не набить пиар?

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

Я тоже, но https://github.com/pallets/jinja/blob/master/jinja2/ext.py кажется хорошим началом.

См. PR № 798.

Будет доступно как новое расширение в версии 2.11.

Спасибо!

Документация расширения отладки должна предупреждать пользователей о непреднамеренном
раскрытие конфиденциальной информации
через тег {% debug %} и как определить, является ли расширение
включен (чтобы статический анализатор мог определить, что кто-то забыл
удалите {% debug .* %} перед выпуском.

983

В пятницу, 4 октября 2019 г., Дэвид Лорд, [email protected] , написал:

Закрыто №174.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите ветку.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги