Zope PostgreSQL变量与HTML和DTML的结合

问题描述 投票:1回答:1

我有一个名为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> 标签的工作方式。

python postgresql zope dtml
1个回答
1
投票

所以,你有一个包含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, _)">

© www.soinside.com 2019 - 2024. All rights reserved.