Flask / Jinja2 kullanarak HTML'yi şablona geçirme


163

Flask ve SQLAlchemy için bir yönetici oluşturuyorum ve farklı girdiler için HTML'yi görünümüme kullanarak geçirmek istiyorum render_template. Geçici çerçeve html'den otomatik olarak kaçıyor gibi görünüyor, bu nedenle tüm <"'> html varlıklarına dönüştürülüyor. HTML'yi doğru bir şekilde oluşturmak için bunu nasıl devre dışı bırakabilirim?

Yanıtlar:


344

ideal yol

{{ something|safe }}

otomatik kaçmayı tamamen kapatmak yerine.


2
merhaba @Armin Ronacher, lütfen daha fazla açıklar ve bir örnek verir misiniz? Teşekkürler.
Samoth

Demek istediğim, örneğin, adlı bir dosyam var userHome.htmlve kullanmak istiyorum return render_template('userHome.html'), ancak doğru bir şekilde oluşturulmuyor ve hepsi krom konsolumdaki html varlıklarına dönüyor .
Samoth

Bu transetiket olarak kullanılmalıdır{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
Bunu yaparken, Siteler Arası Komut Dosyası güvenlik açıklarından kaçınmaya dikkat etmelisiniz , çünkü şablon kütüphanenin yerleşik korumalarını devre dışı bırakıyorsunuz.
Harry Cutts

108

Koddan HTML güvenli olarak da bildirebilirsiniz:

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

Ardından bu değeri şablonlara iletin ve |safebuna değmezler.


4
Markup bir Jinja2 sınıfı, evet. Birçok python kütüphanesi tarafından desteklenen ortak bir arayüz uygular (maalesef Django değil). Aynı nesneyi uygulayan biçimlendirme güvenli paketini de kullanabilirsiniz: pypi.python.org/pypi/MarkupSafe
Armin Ronacher

jinja2'de mevcut
Giovanni G. PY

23

Jinja docs bölümünden HTML Kaçış :

Otomatik kaçış etkinleştirildiğinde, açıkça güvenli olarak işaretlenen değerler dışında her şey varsayılan olarak kaçar. Bunlar uygulama tarafından veya şablonda | safe filtre kullanılarak işaretlenebilir.

Misal:

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

5

Kaçmaya gerek olmayan çok sayıda değişkeniniz varsa, bir autoescapeblok kullanabilirsiniz :

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

1

Bazı insanlar , dize ekranını değiştirmek için güvenlik riskleri taşıyan otomatik görüntüyü kapatıyor gibi görünüyor .

Bir dizeye yalnızca bazı satır satırları eklemek ve satır satırlarını dönüştürmek <br />istiyorsanız, aşağıdaki gibi bir jinja makrosu alabilirsiniz :

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

ve şablonunuzda bunu

{{ linebreaks_for_string( my_string_in_a_variable ) }}
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.