มาใช้ Jinja2 กันเถอะ
จากบล็อกที่แล้ว เราได้คุยกันพอหอมปากหอมคอถึงวิธีไหนบ้างที่เราจะเขียน template string ได้
คราวนี้ มาใช้ Jinja2 กันแบบจริงจังกันบ้างฮะ
ของที่ต้องมีก่อน
แน่นอนฮะ เราต้อง install jinja 2 library ก่อนแหละ ถึงจะใช้งานมันได้
ทีนี้เราก็เริ่มลงมือกันได้ฮะ
1. ตัวแปรใน string
เราสามารถใส่ตัวแปรลงไปใน Jinja2 template ง่ายๆ แค่นี้เลยฮะ
Jinja2 template
{{<variable>}}
เพื่อใส่ค่า variable{{<dict>.<field>}}
เพื่อใส่ค่า key ใน dict ที่กำหนด{# <comment> #}
สำหรับ comment ซึ่งจะไม่แสดงผลออกมาฮะ'{{ }}'
เพื่อแสดงอักขระ quote
Python script
ใช้ Jinja2.Template(template).render(data)
เพื่อ render string ที่เติมตัวแปรนั่นนี่ไปแล้วฮะ
Output
2. ใช้ if-else clauses
Jinja2 support if-else condition ได้นะ
Jinja2 template
{% if <statement> %}
เริ่ม if-else{% elif <statement> %}
ให้เป็น else-if{% else %}
เป็น else{% endif %}
จบ if-else
Python script
สร้างข้อมูลของ Alizabeth แล้วมาดูผลกัน
Output
ดูเหมือนผลลัพท์จะแปลกๆ นะ มีเว้นวรรค ขึ้นบรรทัดใหม่แบบไม่ถูกเท่าไหร่
Jinja2 template (fixed)
- แทนที่จะใช้
{% ... %}
เฉยๆ เราจะเติม dash เป็นแบบนี้{%- ... %}
ซึ่งหมายถึง เราไม่เอา space ที่อยู่ทางซ้ายมือนะ
Output (fixed)
แสดงข้อความถูกต้องแล้วล่ะ
3. เติม loop
Jinja2 support iteration ด้วยแหละ
Jinja2 template
{% for <element> in <iterator> %}
เริ่ม iteration.{{ <element> }}
หรือ ถ้าเป็น dict ก็ใช้{{ <element>.<key>}}
{{ ... -}}
พร้อม dash ทางขวา เพื่อลบ space ทางขวามือ{% else %}
ถ้า iterator ไม่มีตัวแปรข้างในเลย มันจะมาตก case นี้ฮะ{% endfor %}
จบ iteration
Python script
Output
ถ้าเรามีคนที่ไม่มีข้อมูล pets
จะได้แบบนี้
ส่วนถ้ามี pets
จะเป็นแบบนี้
4. เรียก file อื่นมาด้วย
เราสามารถอ้างอิง file Jinja2 template อื่นแล้วมารวมใน file เดียวกันได้นะ
Jinja2 template
{% include '<filepath>' %}
อ้างอิง file ที่เราต้องการ
Python script
ตรงนี้ เราจะใช้ Jinja2.Environment(loader=Jinja2.FileSystemLoader("<folder_path>")).from_string(template).render(data)
ไม่อย่างนั้น จะเจอ error TypeError: no loader for this environment specified
Output
References
- https://stackoverflow.com/a/59177241 สำหรับกรณีเรียก file อื่น