我有一个名为blog_post的postgresql db表,在该表中有一列名为post_main。该列存储了整篇博客文章,包括各种HTML和DTML标签。
作为参考(是的,我知道这是旧的),这是Zope 2.13和PostgreSQL 8.1.19。
举个例子。
<p>This is paragraph 1</p>
<dtml-var "blog.sitefiles.post.postimg1(_.None, _)">
<p>This is paragraph 2</p>
dtml-var标签告诉Zope在两段之间插入dtml-document postimg1的内容。
OK,没有问题。我将这些数据毫无问题地存储在postgres db表中,与输入的数据一模一样,而且我是通过一个ZSQL Method来运行的。<dtml-in zsqlmethod>
标签,包围整个dtml-document,以便能够在页面中调用到我需要的变量。
通常情况下,无论是没有HTML代码还是特别是没有DTML标签,将数据插入到网页中是没有问题的。你可以通过 &dtml-varname;
如果你没有html标签,只想用纯文本输出,或者你用了 <dtml-var varname>
如果你想让数据以正确的html方式呈现和显示。
问题是这样的
Zope只是发布了 <dtml-var "blog.sitefiles.post.postimg1(_.None, _)">
行到html页面,而不是像我直接输入到dtml-doc中那样处理。
我需要的是
我需要将存储在post_main列中的代码(上面引用的是varname)进行处理,就像我直接将其输入到dtml-doc中一样,这样的话 <dtml-var>
标签的工作方式。
所以,你有一个包含DTML文档的变量,你想执行该文档并插入结果?
说实话,我不确定单单在DTML中是否可以这样做,因为一般情况下,用户不希望执行字符串中包含的代码。这和暴露出 eval()
或 exec()
的用户提供的字符串,就像有人可以控制字符串一样,他们在Zope实例上有任意的代码执行。这相当于在你的数据库中存储PHP代码并执行。
坦率地说,我很惊讶你在Zope 2.13上使用DTML,而不是PageTemplates,但我假设你有一个很好的理由。
如果你想解释一个 DTML 变量的值,而不仅仅是插入它,你需要显式地进行解释,使用类似这样的方法。
from DocumentTemplate.DT_HTML import HTML
return HTML(trusted_dtml_string)
这样做的问题是你不能通过网络在脚本(Python)中这样做,因为安全问题。如果你把它作为一个外部方法或文件系统代码来做,很可能会允许任意代码在你的服务器上执行。
恐怕我唯一的建议是避免这样做,这是很难搞好的,错误可能是灾难性的。我强烈建议你不要将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, _)">