Jak renderować dane wyjściowe jinja2 do pliku w Pythonie zamiast w przeglądarce

86

Mam szablon jinja2 (plik .html), który chcę wyrenderować (zastąpić tokeny wartościami z mojego pliku py). Jednak zamiast wysyłać wyrenderowany wynik do przeglądarki, chcę zapisać go w nowym pliku .html. Wyobrażam sobie, że rozwiązanie byłoby również podobne dla szablonu django.

Jak mogę to zrobić?

Bill G.
źródło

Odpowiedzi:

129

A może coś takiego?

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>

wynik

<h1>Hello World!</h1>

Jeśli używasz frameworka, takiego jak Flask, możesz to zrobić u dołu widoku, zanim wrócisz.

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
źródło
Dziękuję za szybką odpowiedź. Jeśli dobrze rozumiem, to do pierwszego fragmentu: ze środowiska importu jinja2, 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 Mogę zastąpić linię drukowania jakąś linią zapisu pliku. Czy to jest poprawne? Jak może wyglądać taka linia do zapisu w pliku? Re. Flask, to mała część większej aplikacji, więc nie wiem, czy byłbym w stanie użyć frameworka.
Bill G.
Dziękuję za wyjaśnienie. W końcu miałem okazję to wypróbować. Początkowo pojawił się błąd „Nie ma takiego pliku lub katalogu: 'moj_nowy_plik.html'”. Najwyraźniej plik już musi istnieć. Następnie skopiowałem plik szablonu i zmieniłem jego nazwę na „my_new_file.html”. Teraz pojawia się błąd: IOError: Plik nie jest otwarty do zapisu. Czy może to być spowodowane tym, że programuję w Google App Engine?
Bill G.
@BillG. Nie, to był błąd z mojej strony. Wypróbuj powyższą zmianę: zmieniono rbna wb.
truskawkowy
Dziękuję za szybką odpowiedź. Zmieniłem rb na wb i teraz pojawia się następujący błąd: IOError: nieprawidłowy tryb: wb
Bill G.
Brakuje )na końcu pierwszej linii w dolnej sekcji kodu. Próbowałem go dodać, ale SO wymaga edycji, aby
zawierały więcej niż
8

Więc po załadowaniu szablonu wywołujesz render, a następnie zapisujesz dane wyjściowe do pliku. Instrukcja „with” to menedżer kontekstu. Wewnątrz wcięcia znajduje się otwarty plik, taki jak obiekt o nazwie „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
źródło
Czy to wyglądałoby mniej więcej tak: 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)) with open ('my_new_html_file.html', 'w') as f: f.write (response.content) gdzie template_values ​​był już wypełniony. Popraw w razie potrzeby. Dzięki.
Bill G.
Dziękuję za wyjaśnienie. W końcu miałem okazję to wypróbować. Początkowo pojawił się błąd „Nie ma takiego pliku lub katalogu: 'moj_nowy_plik.html'”. Najwyraźniej plik już musi istnieć. Następnie skopiowałem plik szablonu i zmieniłem jego nazwę na „my_new_file.html”. Teraz pojawia się błąd: IOError: Plik nie jest otwarty do zapisu. Czy może to być spowodowane tym, że programuję w Google App Engine?
Bill G.