Jinja2 çıktısını Tarayıcı yerine Python'da bir dosyaya nasıl dönüştürürüm


87

Oluşturmak istediğim bir jinja2 şablonum (.html dosyası) var (belirteçleri py dosyamdaki değerlerle değiştirin). İşlenen sonucu bir tarayıcıya göndermek yerine yeni bir .html dosyasına yazmak istiyorum. Çözümün bir django şablonu için de benzer olacağını düşünürdüm.

Bunu nasıl yapabilirim?

Yanıtlar:


130

Bunun gibi bir şeye ne dersiniz?

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>

çıktı

<h1>Hello World!</h1>

Flask gibi bir çerçeve kullanıyorsanız, bunu geri dönmeden önce görünümünüzün alt kısmında yapabilirsiniz.

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

Hızlı yanıt için teşekkürler. Doğru anlıyorsam, o zaman ilk snippet'inize: jinja2 içe aktarma Ortamı, FileSystemLoader env = Environment (loader = FileSystemLoader ('templates')) şablon = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'Merhaba Dünya!') Print output_from_parsed_template Baskı satırını bir tür dosya yazma satırı ile değiştirebilirim. Bu doğru mu? Bir dosyaya yazmak için böyle bir satır neye benzeyebilir? Yeniden. Flask, bu daha büyük bir uygulamanın küçük bir parçası, bu yüzden bir çerçeve kullanıp kullanamayacağımı bilmiyorum.
Bill G.

Açıklama için teşekkürler. Sonunda bunu deneme şansım oldu. Başlangıçta "Böyle bir dosya veya dizin yok: 'my_new_file.html'" hatası aldım. Görünüşe göre dosyanın zaten var olması gerekiyor. Daha sonra şablon dosyasını kopyaladım ve 'my_new_file.html' olarak yeniden adlandırdım. Şimdi bir hata alıyorum: IOError: Dosya yazmak için açılmadı. Bunun nedeni Google App Engine'de geliştirme yapmam olabilir mi?
Bill G.

@BillG. Hayır, benim açımdan bir hataydı. Yukarıdaki değişikliği deneyin: değişmiş rbiçin wb.
sberry

Hızlı cevabınız için teşekkür ederim. Rb'yi wb olarak değiştirdim ve şimdi şu hatayı alıyorum: IOError: geçersiz mod: wb
Bill

)Alt kod bölümünde ilk satırın sonunda bir eksiklik var. Onu eklemeye çalışıyordum, ancak SO düzenlemelerin> 6 karakter olmasını gerektiriyor (aptalca sınırlama) ..
egeland


8

Yani şablonu yükledikten sonra, render'ı çağırır ve ardından çıktıyı bir dosyaya yazarsınız. 'With' ifadesi bir bağlam yöneticisidir. Girintinin içinde, 'f' adında nesne gibi açık bir dosya var.

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)

Öyleyse, bu şuna benzer mi? TEMPLATE_DIR = os.path.join (os.path.dirname ( dosya ), 'templates') jinja_environment = \ jinja2.Environment (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) şablonu = jinja_environment.get_template ('CommentCreate.html') self.response.out.write (şablon.render (şablon_values)) open ('my_new_html_file.html', 'w') olarak f: f.write (response.content) burada şablon_değerleri zaten doldurulmuş. Lütfen gerektiği gibi düzeltin. Teşekkürler.
Bill G.

Açıklama için teşekkürler. Sonunda bunu deneme şansım oldu. Başlangıçta "Böyle bir dosya veya dizin yok: 'my_new_file.html'" hatası aldım. Görünüşe göre dosyanın zaten var olması gerekiyor. Daha sonra şablon dosyasını kopyaladım ve 'my_new_file.html' olarak yeniden adlandırdım. Şimdi bir hata alıyorum: IOError: Dosya yazmak için açılmadı. Bunun nedeni Google App Engine'de geliştirme yapmam olabilir mi?
Bill G.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.