Passare HTML al modello usando Flask / Jinja2


163

Sto creando un amministratore per Flask e SQLAlchemy e voglio passare l'HTML per i diversi input alla mia vista usando render_template. Il framework di template sembra sfuggire automaticamente all'html, quindi tutti i <"'> vengono convertiti in entità html. Come posso disabilitarlo in modo che l'HTML venga visualizzato correttamente?

Risposte:


344

il modo ideale è

{{ something|safe }}

che disattivare completamente la fuga automatica.


2
ciao @Armin Ronacher, potresti per favore spiegare di più e fare un esempio? Grazie.
Samoth,

Voglio dire, ad esempio, ho un file chiamato userHome.htmle vorrei usarlo return render_template('userHome.html'), ma non viene visualizzato correttamente e tutto si trasforma in entità html nella mia console Chrome.
Samoth,

Nel transtag questo deve essere usato come{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
Vale la pena ricordare che dovresti evitare le vulnerabilità di Cross-Site Scripting quando lo fai, poiché stai disabilitando le protezioni incorporate della libreria di template contro di esso.
Harry Cutts,

108

Puoi anche dichiararlo HTML sicuro dal codice:

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

Quindi passa quel valore ai template e loro non devono |safefarlo.


4
Markup è una classe Jinja2, sì. Implementa un'interfaccia comune supportata da molte librerie Python (purtroppo non Django). Puoi anche usare il pacchetto markup safe che implementa lo stesso oggetto: pypi.python.org/pypi/MarkupSafe
Armin Ronacher,

esiste in jinja2
Giovanni G. PY il

23

Dalla sezione Documenti jinja Escaping HTML :

Quando l'escaping automatico è abilitato, per impostazione predefinita viene eseguito l'escaping di tutto, ad eccezione dei valori esplicitamente contrassegnati come sicuri. Questi possono essere contrassegnati dall'applicazione o nel modello utilizzando il filtro | safe.

Esempio:

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

5

Quando hai molte variabili che non necessitano di escape, puoi usare un autoescapeblocco:

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

1

Alcune persone sembrano disattivare l' autoescape che comporta rischi per la sicurezza per manipolare la visualizzazione delle stringhe.

Se vuoi solo inserire alcune interruzioni di riga in una stringa e convertirle in <br />, puoi prendere una macro jinja come:

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

e nel tuo modello basta chiamarlo con

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.