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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top