Переменная Zope PostgreSQL с HTML и DTML

У меня есть таблица db postgresql с именем blog_post и в этой таблице столбец с именем 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-документа postimg1 между двумя абзацами.

Без проблем. Я сохраняю эти данные без проблем в таблице postgres db, точно так, как они были введены, и я запускаю метод ZSQL через<dtml-in zsqlmethod> тег, который окружает весь dtml-документ, чтобы иметь возможность вызывать переменные, которые мне нужны на странице.

Обычно и без HTML-кода ИЛИ, особенно без тегов DTML, вставлять данные на веб-страницу не проблема. Вы делаете это через&dtml-varname; если у вас нет тегов html и вы просто хотите выводить простой текст, ИЛИ вы делаете <dtml-var varname> если вы хотите, чтобы данные отображались и отображались как правильный HTML.

Вот проблема

Zope просто публикует <dtml-var "blog.sitefiles.post.postimg1(_.None, _)"> строку на html-страницу вместо того, чтобы обрабатывать ее, как когда я ввожу ее напрямую в dtml-doc.

Что мне нужно:

Мне нужно, чтобы код, хранящийся в столбце post_main (обозначенный выше как varname), обрабатывался, как если бы я ввел его непосредственно в dtml-документ, чтобы <dtml-var> теги работают так, как должны работать.

1 ответ

Решение

Итак, у вас есть переменная, содержащая документ DTML, и вы хотите выполнить этот документ и вставить результаты?

Честно говоря, я не уверен, что это возможно только в DTML, поскольку обычно пользователи не хотят выполнять код, содержащийся в строках. Это та же опасность, что и обнажениеeval() или exec()строк, предоставленных пользователем, как если бы кто-то мог управлять строкой, выполняемой произвольным кодом в экземпляре Zope. Это эквивалент хранения кода PHP в вашей базе данных и его выполнения.

Честно говоря, я удивлен, что вы вообще используете DTML в Zope 2.13, а не 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, _)">

Другие вопросы по тегам