Melewati HTML ke templat menggunakan Flask / Jinja2

163

Saya sedang membangun admin untuk Flask dan SQLAlchemy, dan saya ingin melewatkan HTML untuk input yang berbeda untuk pandangan saya menggunakan render_template. Kerangka templating tampaknya keluar dari html secara otomatis, jadi semua <"'> dikonversi ke entitas html. Bagaimana saya bisa menonaktifkannya sehingga HTML ditampilkan dengan benar?

Sharvey
sumber

Jawaban:

344

cara yang ideal adalah dengan

{{ something|safe }}

daripada sepenuhnya mematikan pelarian otomatis.

iamgopal
sumber
2
hai @Armin Ronacher, tolong jelaskan lebih banyak dan berikan contoh? Terima kasih.
Samoth
Maksud saya, misalnya, saya memiliki file yang dipanggil userHome.html, dan saya ingin menggunakannya return render_template('userHome.html'), tetapi tidak merender dengan benar dan semua beralih ke entitas html di konsol chrome saya.
Samoth
Dalam transtag ini harus digunakan sebagai{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur
1
Perlu disebutkan bahwa Anda harus berhati-hati untuk menghindari kerentanan Cross-Site Scripting ketika Anda melakukan ini, karena Anda menonaktifkan perlindungan bawaan perpustakaan templating terhadapnya.
Harry Cutts
108

Anda juga dapat mendeklarasikannya sebagai HTML aman dari kode:

from flask import Markup
value = Markup('<strong>The HTML String</strong>')

Kemudian berikan nilai itu ke template dan mereka tidak harus melakukannya |safe.

Armin Ronacher
sumber
4
Markup adalah kelas Jinja2, ya. Ini mengimplementasikan antarmuka umum yang didukung oleh banyak perpustakaan python (sayangnya bukan Django). Anda juga dapat menggunakan paket markup safe yang mengimplementasikan objek yang sama: pypi.python.org/pypi/MarkupSafe
Armin Ronacher
itu ada di jinja2
Giovanni G. PY
23

Dari bagian jinja docs, HTML Escaping :

Ketika pelolosan otomatis diaktifkan semuanya diloloskan secara default kecuali untuk nilai-nilai yang secara eksplisit ditandai sebagai aman. Entah itu dapat ditandai oleh aplikasi atau dalam templat dengan menggunakan filter | safe.

Contoh:

 <div class="info">
   {{data.email_content|safe}}
 </div>
daronwolff
sumber
5

Saat Anda memiliki banyak variabel yang tidak perlu diloloskan, Anda dapat menggunakan autoescapeblok:

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
NieDzejkob
sumber
1

Beberapa orang tampaknya mematikan autoescape yang membawa risiko keamanan untuk memanipulasi tampilan string.

Jika Anda hanya ingin memasukkan beberapa linebreak ke dalam string dan mengkonversi linebreak menjadi <br />, maka Anda bisa mengambil makro jinja seperti:

{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}

dan di templat Anda sebut saja ini dengan

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Helge
sumber