Contrassegna la stringa come sicura in Mako
Domanda
Sto usando i Piloni con i modelli Mako e voglio evitare di scriverlo sempre:
${ h.some_function_that_outputs_html() | n }
Voglio in qualche modo contrassegnare la funzione, o una variabile come sicura (puoi farlo in Django), quindi non devo eseguire continuamente il pipe-en. Qualche idea?
Soluzione
Ho appena scoperto che se inserisci un metodo html nella tua classe, Mako chiamerà semplicemente quel metodo e produrrà qualsiasi cosa restituisca nel modello.
Così ho fatto:
def __html__(self):
return unicode(self)
Questo è fondamentalmente ciò che fa h.literal.
Altri suggerimenti
Secondo i documenti mako sul filtraggio , puoi impostare i filtri predefiniti che vengono applicati all'interno dei modelli durante la creazione di un nuovo Template
nonché per TemplateLookup
(nel qual caso questo si applicherebbe per impostazione predefinita a tutti i modelli che cerca), con l'argomento default_filters
.
Pylons utilizza questo argomento con config/environment.py
per impostare le impostazioni predefinite per il progetto all'interno del file h.literal
:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
Questo è il motivo per cui ottieni l'escaping di default (che non è il caso quando usi Mako da solo). Quindi è possibile modificarlo globalmente nel file di configurazione o non fare affidamento sulla ricerca standard. Attenzione che dovresti ovviamente usare un filtro esplicito per sfuggire a ciò che è necessario scappare.
Puoi anche passare una stringa " contrassegnata come sicura " con l'helper Pylons h.literal('This will <b>not</b> be escaped')
, ad esempio se passassi spam
al modello, ad esempio come variabile denominata ${spam}
, potresti semplicemente usare <=> senza scappare.
Se si desidera lo stesso effetto quando si chiama una determinata funzione dall'interno di un modello, questa funzione dovrebbe restituire un valore letterale o fornire un supporto per quella funzione che chiama <=> sul risultato se si desidera uscire solo la funzione originale. (o immagino che potresti anche chiamarlo tramite un " Filtro def " (vedi lo stesso documento Mako come sopra), non l'ho ancora sperimentato)