Como llamar en defs plantilla con nombres sólo se conoce en tiempo de ejecución en el lenguaje de plantillas Python Mako?
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?
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?