Web.py с ошибкой «выполнение операторов Constant запрещено» - PullRequest
0 голосов
/ 03 апреля 2020

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()

шаблонов / тестов. html:

$def with (name)
$if name:
    I just wanted to say <em>hello</em> to $name.
$else:
    <em>Hello</em>, world!

Среда: Python38 x64, Windows 10, 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

Решение найдено:

Как исправить ошибку "выполнение операторов 'Constant' запрещена"?

Как предложил pbuck, просто добавьте:

from web.template import ALLOWED_AST_NODES
ALLOWED_AST_NODES.append('Constant')

и все работает!

Вопрос:

Почему он запрещает мое конкретное утверждение в тесте. html ( Вы не уверены, что означает "Константа" - это узел в python3 AST, но не в python2 "в ответе pbuck)?

Есть ли проблемы с моим кодом?

Почему / Как работает решение?

1 Ответ

0 голосов
/ 14 апреля 2020

Это не ошибка в вашем коде, это проблема совместимости, которая должна быть исправлена ​​в web.py.

AST - это абстрактное синтаксическое дерево - внутренняя структура, создаваемая python при анализе вашего python code (Ваш шаблон преобразуется в python code с помощью web.py и затем выполняется).

Часть синтаксического дерева указывает, что все есть - оператор, выражение, аргументы, операторы и т. д. c. (См. https://docs.python.org/3/library/ast.html#ast .parse ) ... но вам действительно не нужно знать все это.

В результате анализа, web.py проходит, чтобы убедиться, что ( по соображениям безопасности) вы используете только «разрешенные» типы узлов. То есть не все допустимые конструкции python являются допустимыми в шаблоне web.py. (Почему? Не знаю - именно так был разработан web.py.)

web.py начинался как python2 и портировался на python3. Узел «Константа» был введен в python3, а в 3.8 «Константа» теперь используется всеми константами. (Почему? Превосходит меня - это внутреннее python magi c.) Может показаться, что web.py должен быть обновлен, чтобы разрешить использование константных узлов в шаблонах.

Пока не обновлен выпуск web.py, вы может обновить ваш код, чтобы он работал без проблем.

...