Использовать шаблоны Chameleon ZPT для выписки выписок
Я использую Пирамиду, и я знаю, что это, вероятно, не предпочтительный способ сделать что-то, но это было бы действительно здорово. У меня есть куча скриптов Python, которые печатаются на стандартный вывод. Теперь я хочу запустить эти сценарии как часть запроса / ответа в Pyramid. Я хочу записать стандартный вывод сценариев и записать его в шаблон.
Захватить часть стандартного вывода довольно просто:
import sys
sys.stdout = tbd
Насколько я вижу, render_to_response не поддерживает ничего из этого:
return render_to_response(’templates/foo.pt’,
{’foo’:1, ’bar’:2},
request=request)
Любая идея, как я могу получить операцию write() на шаблоне?
2 ответа
Я мог бы использовать модуль подпроцесса для захвата stdout скрипта вместо того, чтобы импортировать его и запустить напрямую:
import StringIO
output = StringIO.StringIO()
result = subprocess.call('python', 'myscript.py', stdout=output)
value = output.get_value()
string = render(’templates/foo.pt’,
{'value':value},
request=request)
Вы можете передать объект StringIO.StringIO в stdout, а затем передать его шаблону через контекстный словарь и просто вызвать StringIO.StringIO.getvalue() в нужное время в шаблоне:
import sys
def my_view(request):
old_stdout = sys.stdout
new_stdout = StringIO.StringIO()
sys.stdout = new_stdout
# execute your scripts
sys.stdout = old_stdout
return render_to_response('template/foo.pt', {'foo': 1, 'bar': 2, 'stdout': new_stdout},
request=request)
а затем в шаблоне:
<html>
<body>
<!-- stuff -->
${stdout.getvalue()}
<!-- other stuff -->
</body>
</html>
Возможно, вам потребуется добавить фильтр, чтобы убедиться, что текст отформатирован правильно, или вы можете просто создать подкласс StringIO.StringIO с __html__
метод, который будет делать вещи, как вы считаете нужным.