Pregunta

Estoy usando Pilones con plantillas Mako y quiero evitar escribir esto todo el tiempo:

${ h.some_function_that_outputs_html() | n }

Quiero marcar de alguna manera la función, o una variable como segura (puedes hacer eso en Django) para no tener que conectarme todo el tiempo. ¿Algunas ideas?

¿Fue útil?

Solución

Me acabo de enterar de que si pones un método html en tu clase, entonces Mako simplemente llamará a ese método y generará lo que devuelva en la plantilla.

Entonces lo hice:

def __html__(self):
    return unicode(self)

Eso es básicamente lo que hace h.literal.

Otros consejos

De acuerdo con documentos de mako sobre filtrado , puede configurar los filtros predeterminados que se aplican dentro de las plantillas al crear un nuevo Template así como también para el TemplateLookup (en cuyo caso esto se aplicaría por defecto para todas las plantillas que busca), con el argumento default_filters.

Pylons usa este argumento con config/environment.py para establecer los valores predeterminados para su proyecto dentro del archivo 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'])

Es por eso que obtienes el escape de forma predeterminada (que no es el caso cuando usas Mako por ti mismo). Por lo tanto, puede cambiarlo globalmente en el archivo de configuración o no confiar en la búsqueda estándar. Tenga en cuenta que, por supuesto, debe usar explícitamente un filtro para escapar de las cosas que necesitan escapar.

También puede pasar una cadena " marcada como segura " con el ayudante Pylons h.literal('This will <b>not</b> be escaped'), por ejemplo, si pasara spam a la plantilla, por ejemplo, como una variable llamada ${spam}, podría usar <=> sin escapar.

Si desea el mismo efecto cuando llama a una determinada función desde dentro de una plantilla, esta función necesitaría devolver un literal así o proporcionar un ayudante para esa función que llame a <=> en el resultado si desea salir La función original solo. (o supongo que también podría llamarlo a través de un " Filtering def " (vea el mismo documento de Mako que el anterior), aún no he experimentado con eso)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top