Как визуализировать вывод jinja2 в файл на Python вместо браузера

87

У меня есть шаблон jinja2 (файл .html), который я хочу отобразить (замените токены значениями из моего файла py). Однако вместо того, чтобы отправлять визуализированный результат в браузер, я хочу записать его в новый файл .html. Я предполагаю, что решение также будет аналогичным для шаблона django.

Как я могу это сделать?

Билл Г.
источник

Ответы:

130

Как насчет этого?

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('test.html')
output_from_parsed_template = template.render(foo='Hello World!')
print(output_from_parsed_template)

# to save the results
with open("my_new_file.html", "w") as fh:
    fh.write(output_from_parsed_template)

test.html

<h1>{{ foo }}</h1>

вывод

<h1>Hello World!</h1>

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

output_from_parsed_template = render_template('test.html', foo="Hello World!")
with open("some_new_file.html", "wb") as f:
    f.write(output_from_parsed_template)
return output_from_parsed_template
sberry
источник
Спасибо за оперативный ответ. Если я правильно понимаю, то к вашему первому фрагменту: from jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ('templates')) template = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'Hello World!') Print output_from_parsed_template Я мог бы заменить строку печати какой-нибудь строкой записи файла. Это правильно? Как могла бы выглядеть такая строка для записи в файл? Re. Flask, это небольшая часть большого приложения, поэтому я не знаю, смогу ли я использовать фреймворк.
Билл Г.
Спасибо за разъяснения. Наконец-то у меня появилась возможность попробовать это. Первоначально я получил ошибку «Нет такого файла или каталога: 'my_new_file.html'». Видимо файл уже должен существовать. Затем я скопировал файл шаблона и переименовал его в my_new_file.html. Теперь я получаю сообщение об ошибке: IOError: Файл не открыт для записи. Может быть, я занимаюсь разработкой в ​​Google App Engine?
Билл Г.
@BillG. Нет, это была моя ошибка. Попробуйте изменить выше: изменено rbна wb.
sberry
Спасибо за быстрый ответ. Я изменил rb на wb, и теперь я получаю следующую ошибку: IOError: invalid mode: wb
Bill G.
В )нижней части кода отсутствует конец первой строки. Я пытался добавить это, но SO требует, чтобы изменения были> 6 символов (глупое ограничение) ..
egeland 05
8

Итак, после загрузки шаблона вы вызываете render, а затем записываете результат в файл. Оператор with - это менеджер контекста. Внутри отступа у вас есть открытый файл, такой как объект с именем 'f'.

template = jinja_environment.get_template('CommentCreate.html')     
output = template.render(template_values)) 

with open('my_new_html_file.html', 'w') as f:
    f.write(output)
айчиди
источник
Итак, будет ли это выглядеть примерно так: TEMPLATE_DIR = os.path.join (os.path.dirname ( file ), 'templates') jinja_environment = \ jinja2.Environment (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) template = jinja_environment.get_template ('CommentCreate.html') self.response.out.write (template.render (template_values)) с open ('my_new_html_file.html', 'w') как f: f.write (response.content) где template_values ​​уже заполнены. При необходимости исправьте. Благодарю.
Билл Г.
Спасибо за разъяснения. Наконец-то у меня появилась возможность попробовать это. Первоначально я получил ошибку «Нет такого файла или каталога: 'my_new_file.html'». Видимо файл уже должен существовать. Затем я скопировал файл шаблона и переименовал его в my_new_file.html. Теперь я получаю сообщение об ошибке: IOError: Файл не открыт для записи. Может быть, я занимаюсь разработкой в ​​Google App Engine?
Билл Г.