Использовать шаблоны 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__ метод, который будет делать вещи, как вы считаете нужным.

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