ฉันจะแสดงผล jinja2 เป็นไฟล์ใน Python แทนเบราว์เซอร์ได้อย่างไร


88

ฉันมีเทมเพลต 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

ขอบคุณสำหรับการตอบกลับที่รวดเร็ว ถ้าฉันเข้าใจถูกต้องจากนั้นไปที่ snippit แรกของคุณ: from jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ('template')) template = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'Hello World!') print output_from_parsed_template ฉันสามารถแทนที่บรรทัดการพิมพ์ด้วยบรรทัดเขียนไฟล์บางประเภท ถูกต้องหรือไม่ บรรทัดที่จะเขียนลงในไฟล์อาจมีลักษณะอย่างไร? เรื่อง กระติกน้ำนี่เป็นส่วนเล็ก ๆ ของแอพที่ใหญ่กว่าดังนั้นฉันไม่รู้ว่าจะใช้เฟรมเวิร์คได้ไหม
Bill G.

ขอขอบคุณสำหรับการชี้แจง. ในที่สุดฉันก็มีโอกาสได้ลองใช้ เริ่มแรกฉันได้รับข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว: 'my_new_file.html'" เห็นได้ชัดว่าต้องมีไฟล์อยู่แล้ว จากนั้นฉันคัดลอกไฟล์เทมเพลตและเปลี่ยนชื่อเป็น 'my_new_file.html' ตอนนี้ฉันได้รับข้อผิดพลาด: IOError: ไฟล์ไม่เปิดให้เขียน อาจเป็นเพราะฉันกำลังพัฒนาใน Google App Engine หรือเปล่า
Bill G.

@BillG. ไม่มันเป็นข้อผิดพลาดในส่วนของฉัน ลองเปลี่ยนแปลงข้างต้น: เปลี่ยนไปrb wb
sberry

ขอบคุณสำหรับการตอบสนองอย่างรวดเร็ว. ฉันเปลี่ยน rb เป็น wb และตอนนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: IOError: โหมดไม่ถูกต้อง: wb
Bill G

)ท้ายบรรทัดแรกขาดหายไปในส่วนโค้ดด้านล่าง ฉันพยายามเพิ่ม แต่ SO ต้องการการแก้ไขเพื่อให้มี> 6 ตัวอักษร (ข้อ จำกัด โง่ ๆ ) ..
egeland


8

หลังจากที่คุณโหลดเทมเพลตแล้วคุณจะเรียกการแสดงผลจากนั้นเขียนผลลัพธ์ลงในไฟล์ คำสั่ง '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 ), 'template') jinja_environment = \ jinja2.Environment (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) เทมเพลต = jinja_environment.get_template ('CommentCreate.html') self.response.out.write (template.render (template_values)) พร้อมเปิด ('my_new_html_file.html', 'w') เป็น f: f.write (response.content) โดยที่ template_values ​​ที่เติมข้อมูลแล้ว กรุณาแก้ไขตามความจำเป็น ขอบคุณ.
Bill G.

ขอขอบคุณสำหรับการชี้แจง. ในที่สุดฉันก็มีโอกาสได้ลองใช้ เริ่มแรกฉันได้รับข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว: 'my_new_file.html'" เห็นได้ชัดว่าต้องมีไฟล์อยู่แล้ว จากนั้นฉันคัดลอกไฟล์เทมเพลตและเปลี่ยนชื่อเป็น 'my_new_file.html' ตอนนี้ฉันได้รับข้อผิดพลาด: IOError: ไฟล์ไม่เปิดให้เขียน อาจเป็นเพราะฉันกำลังพัฒนาใน Google App Engine หรือเปล่า
Bill G.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.