Включить и исключить строковый вывод при рендеринге шаблона jinja2 с помощью фильтрации - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь создать шаблон для поддержки строк конфигурации для конкретной консольной платформы c.

Текущая конфигурация имеет следующий формат:

Пример 1:

/settings/network_connections/ETH0/ipv4_mode=static
/settings/network_connections/ETH0/pv4_address=10.0.0.10
/settings/network_connections/ETH0/ipv4_bitmask=24 
/settings/network_connections/ETH0/ipv4_gateway=10.0.0.1

Если вы хотите настроить следующие строки выше, перед ним стоит слово «set», например:

Пример 2:

set /settings/network_connections/ETH0/ipv4_mode=static
set /settings/network_connections/ETH0/pv4_address=10.0.0.10
set /settings/network_connections/ETH0/ipv4_bitmask=24 
set /settings/network_connections/ETH0/ipv4_gateway=10.0.0.1

В моем jinja2 шаблона, у меня есть что-то вроде этого:

Пример 3

{{ set| remediation }} /settings/network_connections/ETH0/ipv4_mode=static
{{ set| remediation }} /settings/network_connections/ETH0/pv4_address=10.0.0.10
{{ set| remediation }} /settings/network_connections/ETH0/ipv4_bitmask=24
{{ set| remediation }} /settings/network_connections/ETH0/ipv4_gateway=10.0.0.1

Я хочу иметь возможность визуализировать шаблон и иметь возможность выводить то, что у меня есть в примере 2 (с помощью 'set' ), а также возможность вывода как Пример 1 (без 'set') с использованием логической переменной (with_remediation). Если True, включить «набор» - иначе исключить «набор». В примере 3 «исправление» - это встроенный пользовательский фильтр.

import jinja2

loader = jinja2.FileSystemLoader('/tmp')
env = jinja2.Environment(autoescape=True, loader=loader)

def remediation(input,with_remediation):
    """Custom filter"""
    if(with_remediation):
        return input
    else:
        return ""

env.filters['remediation'] = remediation
temp = env.get_template('template.jinja2')
temp.render(set="set")

Но я не уверен, как передать переменную with_remediation в функцию remediate.

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

Кроме того, как я могу кодировать так что "набор" может быть любой "строкой", какой я хочу? Должен ли я включать каждую строку, которую хочу использовать, в строку temp.render(set="set")? Например; temp.render(set="set", delete="delete",rename="rename") или есть более эффективный способ решения этой проблемы?

1 Ответ

1 голос
/ 20 июня 2020

Я смог разрешить это, сделав это; вывод «установить», установив для параметра with_remediation значение True; исключить вывод 'set', установив для параметра with_remediation значение False:

import jinja2

loader = jinja2.FileSystemLoader('/tmp')
env = jinja2.Environment(autoescape=True, loader=loader)

with_remediation = True

def remediation(input):
    """Custom filter"""
    if(with_remediation):
        return input
    else:
        return ''

env.filters['remediation'] = remediation
temp = env.get_template('template.jinja2')
temp.render(set='set')

Шаблон:

{{ set | remediation }}/settings/network_connections/ETH0/ipv4_mode=static
{{ set | remediation }}/settings/network_connections/ETH0/pv4_address=10.0.0.10
{{ set | remediation }}/settings/network_connections/ETH0/ipv4_bitmask=24
{{ set | remediation }}/settings/network_connections/ETH0/ipv4_gateway=10.0.0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...