2009-12-01 19 views
11

estoy usando los pilones con plantillas Mako y quiero evitar tener que escribir esto todo el tiempo:Marcos cadena como seguro en Mako

${ h.some_function_that_outputs_html() | n } 

Quiero marcar de alguna manera la función, o una variable como seguro (que puede hacer eso en Django) así que no tengo que pipe-en todo el tiempo. ¿Algunas ideas?

Respuesta

10

acabo de saber que si se pone método en un html su clase, entonces Mako simplemente llamará a ese método y generará lo que devuelva en la plantilla.

Así que lo hice:

def __html__(self): 
    return unicode(self) 

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

+0

Esto tiene que ir a la "clase" que devuelve 'h.some_function_that_outputs_html()' Asumo. – Felix

3

De acuerdo con la mako docs about filtering, puede configurar los filtros predeterminados que se aplican dentro de las plantillas al crear un nuevo Template, así como para la TemplateLookup (en cuyo caso esto se aplicaría de forma predeterminada para todas las plantillas que se ve arriba), con el argumento default_filters.

Pilones utiliza este argumento con TemplateLookup para establecer los valores predeterminados para su proyecto dentro del archivo config/environment.py:

# 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 esto que se obtiene el escape por defecto (que no es el caso cuando se utiliza Mako por sí mismo) Por lo tanto, podría cambiarlo globalmente en el archivo de configuración o no confiar en la búsqueda estándar. Tenga en cuenta que, por supuesto, debe utilizar explícitamente un filtro para escapar de las cosas que sí necesitan escaparse.

También puede pasar una cadena "seguros" con el ayudante Pilones h.literal, por ejemplo, si usted pasaría h.literal('This will <b>not</b> be escaped') a la plantilla, digamos como una variable llamada spam, es posible que utilices ${spam} sin ningún escape.

Si desea el mismo efecto cuando llama a una determinada función desde dentro de una plantilla, esta función debería devolver tal literal, o proporcionar un ayudante para esa función que llame al h.literal en el resultado si desea abandonar el función original solo. (O supongo que también se puede llamar así, a través de un "def Filtering" (ver doc Mako mismo que el anterior), no han experimentado con la que aún)

+0

Gracias, esto funcionó para mí – disc0dancer

+0

Sólo un aviso para las personas que usan la primera solución (eliminación de escape de default_filters) - tiene que borrar el caché (rm -r data/templates/*) para verlo funcionar (Acabo de pasar un poco preguntándose qué sucede). – zefciu

Cuestiones relacionadas