Como faço para renderizar a saída do jinja2 em um arquivo em Python em vez de em um navegador

87

Tenho um modelo jinja2 (arquivo .html) que desejo renderizar (substituir os tokens por valores do meu arquivo py). Em vez de enviar o resultado renderizado para um navegador, no entanto, quero gravá-lo em um novo arquivo .html. Eu imagino que a solução também seria semelhante para um modelo django.

Como posso fazer isso?

Bill G.
fonte

Respostas:

130

Que tal algo como isso?

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>

resultado

<h1>Hello World!</h1>

Se você estiver usando uma estrutura, como o Flask, poderá fazer isso na parte inferior da sua visualização, antes de retornar.

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
fonte
Obrigado pela resposta rápida. Se estou entendendo corretamente, então para o seu primeiro fragmento: from jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ('templates')) template = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'Olá, Mundo!') Print output_from_parsed_template Eu poderia substituir a linha de impressão por algum tipo de linha de gravação de arquivo. Isso está correto? Como seria essa linha para gravar em um arquivo? Ré. Flask, essa é uma pequena parte de um aplicativo maior, então não sei se conseguiria usar um framework.
Bill G.
Obrigado pelo esclarecimento. Eu finalmente tive a chance de experimentar isso. Inicialmente, recebi um erro "Nenhum arquivo ou diretório: 'my_new_file.html'". Aparentemente, o arquivo já deve existir. Em seguida, copiei o arquivo de modelo e renomeei-o para 'my_new_file.html'. Agora recebo um erro: IOError: Arquivo não aberto para gravação. Será que estou desenvolvendo no Google App Engine?
Bill G.
@BillG. Não, foi um erro da minha parte. Experimente a alteração acima: mudou rbpara wb.
sberry
Obrigado pela resposta rápida. Mudei a rb para wb e agora recebo o seguinte erro: IOError: invalid mode: wb
Bill G.
Há uma falta )no final da primeira linha na seção de código inferior. Eu estava tentando adicioná-lo, mas SO requer que as edições tenham> 6 caracteres (limitação estúpida) ..
egeland
8

Assim, depois de carregar o modelo, você chama render e grava a saída em um arquivo. A instrução 'with' é um gerenciador de contexto. Dentro da indentação, você tem um arquivo aberto como um objeto chamado '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)
Aychedee
fonte
Então, seria algo como: 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)) com open ('my_new_html_file.html', 'w') como f: f.write (response.content) onde template_values ​​onde já foi preenchido. Corrija conforme necessário. Obrigado.
Bill G.
Obrigado pelo esclarecimento. Eu finalmente tive a chance de experimentar isso. Inicialmente, recebi um erro "Não existe esse arquivo ou diretório: 'my_new_file.html'". Aparentemente, o arquivo já deve existir. Em seguida, copiei o arquivo de modelo e renomeei-o para 'my_new_file.html'. Agora recebo um erro: IOError: Arquivo não aberto para gravação. Será que estou desenvolvendo no Google App Engine?
Bill G.