Web.py 有 "execution of 'Constant' statements is denied" 错误
Web.py with "execution of 'Constant' statements is denied" error
test.py:
import web
render = web.template.render('templates/')
urls = (
'/', 'index'
)
class index:
def GET(self):
name='Bob'
return render.test(name)
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
templates/test.html:
$def with (name)
$if name:
I just wanted to say <em>hello</em> to $name.
$else:
<em>Hello</em>, world!
环境:Python38x64,Windows10,Web.py==0.4
错误详情:
raise SecurityError("\n".join([str(err) for err in self.errors]))
web.template.SecurityError: templates\test.html:3 - execution of 'Constant' statements is denied
templates\test.html:7 - execution of 'Constant' statements is denied
templates\test.html:7 - execution of 'Constant' statements is denied
templates\test.html:7 - execution of 'Constant' statements is denied
templates\test.html:9 - execution of 'Constant' statements is denied
找到的解决方案:
正如 pbuck 建议的那样,只需添加:
from web.template import ALLOWED_AST_NODES
ALLOWED_AST_NODES.append('Constant')
而且有效!
问题:
为什么它不允许我在 test.html 中的特定语句(不确定“'Constant' 是 python3 AST 中的节点,但不是 python2 中的节点是什么意思”在 pbuck 的回答中)?
我的代码有问题吗?
Why/How 解决方案有效吗?
这不是您的代码中的错误,而是一个兼容性问题,应该在 web.py 中修复。
AST 是抽象语法树——内部结构 python 在解析您的 python 代码时创建(您的模板由 web.py 转换为 python 代码,并且然后执行)。
语法树的一部分指明了所有内容——语句、表达式、参数、运算符等(请参阅 https://docs.python.org/3/library/ast.html#ast.parse)...但您真的不需要知道所有这些。
解析的结果 web.py 通过以确保(出于安全原因)您仅使用 "allowed" 节点类型。也就是说,并非所有合法的 python 构造在 web.py 模板中都是合法的。 (为什么?不知道 - 这就是 web.py 的设计方式。)
web.py 从 python2 开始并移植到 python3。 'Constant' 节点是在 python3 和 3.8 中引入的,'Constant' 现在被所有常量使用。 (为什么?打败了我——那是内部 python 魔法。)看起来 web.py 应该更新以允许模板中的常量节点。
在更新 web.py 版本之前,您可以更新您的代码以使其正常运行。
test.py:
import web
render = web.template.render('templates/')
urls = (
'/', 'index'
)
class index:
def GET(self):
name='Bob'
return render.test(name)
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
templates/test.html:
$def with (name)
$if name:
I just wanted to say <em>hello</em> to $name.
$else:
<em>Hello</em>, world!
环境:Python38x64,Windows10,Web.py==0.4
错误详情:
raise SecurityError("\n".join([str(err) for err in self.errors]))
web.template.SecurityError: templates\test.html:3 - execution of 'Constant' statements is denied
templates\test.html:7 - execution of 'Constant' statements is denied
templates\test.html:7 - execution of 'Constant' statements is denied
templates\test.html:7 - execution of 'Constant' statements is denied
templates\test.html:9 - execution of 'Constant' statements is denied
找到的解决方案:
正如 pbuck 建议的那样,只需添加:
from web.template import ALLOWED_AST_NODES
ALLOWED_AST_NODES.append('Constant')
而且有效!
问题:
为什么它不允许我在 test.html 中的特定语句(不确定“'Constant' 是 python3 AST 中的节点,但不是 python2 中的节点是什么意思”在 pbuck 的回答中)?
我的代码有问题吗?
Why/How 解决方案有效吗?
这不是您的代码中的错误,而是一个兼容性问题,应该在 web.py 中修复。
AST 是抽象语法树——内部结构 python 在解析您的 python 代码时创建(您的模板由 web.py 转换为 python 代码,并且然后执行)。
语法树的一部分指明了所有内容——语句、表达式、参数、运算符等(请参阅 https://docs.python.org/3/library/ast.html#ast.parse)...但您真的不需要知道所有这些。
解析的结果 web.py 通过以确保(出于安全原因)您仅使用 "allowed" 节点类型。也就是说,并非所有合法的 python 构造在 web.py 模板中都是合法的。 (为什么?不知道 - 这就是 web.py 的设计方式。)
web.py 从 python2 开始并移植到 python3。 'Constant' 节点是在 python3 和 3.8 中引入的,'Constant' 现在被所有常量使用。 (为什么?打败了我——那是内部 python 魔法。)看起来 web.py 应该更新以允许模板中的常量节点。
在更新 web.py 版本之前,您可以更新您的代码以使其正常运行。