Como llamar en defs plantilla con nombres sólo se conoce en tiempo de ejecución en el lenguaje de plantillas Python Mako?

StackOverflow https://stackoverflow.com/questions/923837

  •  06-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de encontrar una forma de llamar a las plantillas def determinados por los datos disponibles en el contexto.

Editar Un ejemplo simple de la misma pregunta.

Es posible emitir el valor de un objeto en el contexto:

# in python
ctx = Context(buffer, website='stackoverflow.com')

# in mako
<%def name="body()">
I visit ${website} all the time.
</%def>

Produce:

I visit stackoverflow.com all the time. 

Me gustaría para permitir una personalización de la salida, en base a los datos.

# in python 
ctx = Context(buffer, website='stackoverflow.com', format='text')

# in mako
<%def name="body()">
I visit ${(format + '_link')(website)} all the time. <-- Made up syntax.
</%def>

<%def name='html_link(w)'>
<a href='http://${w}'>${w}</a>
</%def>

<%def name='text_link(w)'>
${w}
</%def>

Cambio del atributo format en el contexto debe cambiar la salida de

I visit stackoverflow.com all the time.

a

I visit <a href='http://stackoverflow.com'>stackoverflow.com</a> all the time.

La formado por la sintaxis he utilizado en el body def es obviamente erróneo. ¿Qué necesitaría para especificar dinámicamente una plantilla, y luego llamarlo?

¿Fue útil?

Solución

Toma algunos jugando con el espacio de nombres local de mako, pero aquí es un ejemplo de trabajo:

from mako.template import Template
from mako.runtime import Context
from StringIO import StringIO

mytemplate = Template("""
<%def name='html_link(w)'>
<a href='http://${w}'>${w}</a>
</%def>
<%def name='text_link(w)'>
${w}
</%def>
<%def name="body()">
I visit ${getattr(local, format + '_link')(website)} all the time.
</%def>
""")

buf = StringIO()
ctx = Context(buf, website='stackoverflow.com', format='html')
mytemplate.render_context(ctx)
print buf.getvalue()

Como se desea, este emite:

I visit 
<a href='http://stackoverflow.com'>stackoverflow.com</a>
 all the time.

Otros consejos

¿Qué tal si primero se genera la plantilla (de otra plantilla :) y, a continuación, ejecutar que con sus datos?

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