Flask | JINJA 2: render_template_string () с макросом, импортированным в контексте - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу сделать макросы доступными внутри статей для моего flask блога. Когда тело моего блога изменяется, я запускаю следующий код, чтобы отобразить тело в HTML:

target.body_html = bleach.linkify(bleach.clean(render_template_string(value),tags=allowed_tags, attributes=allowed_attr, strip=True))

render_template_string (value) - это часть, которая меня беспокоит. Чтобы использовать макрос внутри строки шаблона (значения), каждая отдельная строка должна включать следующее, чтобы я мог использовать макросы из этого файла в теле статьи:

{% import "includes/macros.html.j2" as macros %}

Это не будет Разумно убедиться, что авторы имеют доступ к макросам, которые я пишу во всех своих статьях. Есть ли способ передать этот аргумент через функцию render_template_string (), чтобы его не нужно было определять в каждой строке? Или иначе создать шаблон, внутри которого отображается строка? Примерно так:

render_template_string(string,macros=function_to_import_macros("includes/macros.html.j2")) 

1 Ответ

0 голосов
/ 22 апреля 2020

Хотя кажется, что не существует решения для передачи всего макроса шаблона в качестве контекста, get_template_attribute действительно позволяет вам передавать отдельные макросы по одному. Пример:

включает / макрос. html .j2:

{% macro hello() %}Hello!{% endmacro %}
{% macro hello_with_name(name) %}Hello, {{ name }}!{% endmacro %}

Код рендеринга шаблона:

hello = get_template_attribute("includes/macros.html.j2","hello")
hello_with_name = get_template_attribute("includes/macros.html.j2","hello_with_name")
return render_template("index.html", hello=hello,hello_with_name=hello_with_name)

index. html:

{{ hello() }}
{{ hello_with_name("Bob") }}

Это решение позволит добавлять отдельные макросы в контекст при визуализации шаблона или template_string и даже может быть добавлено в глобальный контекст с помощью этого метода. Если кто-нибудь знает, как добавить весь шаблон, полный макросов, это было бы здорово, но это обеспечивает базовую c необходимую функциональность.

...