Итак, у вас есть переменная, содержащая документ DTML, и вы хотите выполнить этот документ и вставить результаты?
Честно говоря, я не уверен, что это возможно только в DTML, так как это обычно пользователи не хотят выполнять код, содержащийся в строках. Это та же опасность, что и раскрытие eval()
или exec()
строк, предоставленных пользователем, как если бы кто-то мог контролировать строку, выполняемую произвольным кодом в экземпляре Zope. Это эквивалент хранения кода PHP в вашей базе данных и его выполнения.
Честно говоря, я удивлен, что вы вообще используете DTML в Zope 2.13, а не PageTemplates, но я предполагаю, что у вас есть веская причина для этого.
Если вы хотите интерпретировать значение переменной DTML, а не просто вставлять ее, вам нужно явно выполнить интерпретацию, используя что-то вроде:
from DocumentTemplate.DT_HTML import HTML
return HTML(trusted_dtml_string)
Проблема в том, что вы не можете сделать это в скрипте (Python) через Интернет из соображений безопасности. Если вы сделаете это как внешний метод или код файловой системы, очень вероятно, что вы разрешите выполнение произвольного кода на своем сервере.
Боюсь, моя единственная рекомендация - избегать этого, очень сложно получить это правильно и ошибки могут быть катастрофическими c. Я настоятельно рекомендую вам не хранить теги DTML как часть статей вашего блога.
В качестве альтернативы, если у вас есть фиксированное количество делегаций для методов DTML, я рекомендую написать сценарий Python, например как:
## Script (Python) "parse_variables"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=post, _
##title=
##
post = post.replace("##POST_IMAGE##", context.postimg(None, _))
return post
И затем вызов его с вашей переменной, которая содержит данные, предоставленные пользователем, например <dtml-var expr="parse_variables(data, _)">