2012-10-01 7 views
8

Sto utilizzando Flask in un'app che esegue il rendering di alcuni dati da un database SQLite. Il mio problema è quando l'app esegue il rendering di un testo che contiene html, appare come testo invece di html. Ad esempio, il record nel database ha il seguente testo:Come rendere il contenuto html con jinja usando la fiaschetta?

My tailor <strong>is</strong> rich 

la pagina HTML di rendering come è:

<html> 
<!-- snip .... --> 
My tailor &gt;strong&lt;is&gt;/strong&lt; rich 
<!-- snip .... --> 
</html> 

E, quello che voglio è questo ("è" parola deve essere più audaci) :

<html> 
<!-- snip .... --> 
My tailor <strong>is</strong> rich 
<!-- snip .... --> 
</html> 

Qualcuno sa come posso farlo?

risposta

26

Se si conosce il contenuto è sicuro, è sufficiente utilizzare il filtro safe:

{# In the Jinja template #} 
{% for article in articles %} 
<div class="article">{{article|safe}}</div> 
{% endfor %} 
-1

Un'altra possibilità è quella di utilizzare la classe Jinja Markup, proprio come filtro di sicurezza fa. Ciò ti consentirà di eseguire il rendering dell'HTML senza filtrare il contenuto attraverso il filtro sicuro. Di seguito è riportato un esempio di come ciò può essere realizzato.

from jinja2 import Markup, escape 

def render_markup(): 
    return Markup("{0}{1}{2}{3}{4}".format(
     escape("My tailor "), 
     "<strong>", 
     escape("is"), 
     "</strong>", 
     escape(" rich"))) 

Dopo questo è possibile registrare il funzione nelle globali Flask Jinja, e utilizzarlo dal modello Jinja.

app.jinja_env.globals["render_markup"] = render_markup 

Nessuna sicurezza necessaria nel modello.

<html> 
<!-- snip .... --> 
{{ render_markup() }} 
<!-- snip .... --> 
</html> 
+4

vorrei strappare a chiunque di brandelli durante le revisioni del codice se che stava costruendo un messaggio come lo fai nel tuo primo esempio :) – ThiefMaster

+0

Eh, solo un esempio un po 'sciocca di come formattare stringa ancora più stupida, ed utilizzare correttamente la fuga funzione :) – Boris