использовать шаблоны ZPT Chameleon для выписки выписок - PullRequest
0 голосов
/ 01 августа 2011

Я использую Пирамиду, и я знаю, что это, вероятно, не предпочтительный способ сделать что-то, но это было бы действительно здорово.У меня есть куча скриптов 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 ]

3 голосов
/ 02 августа 2011

Я мог бы использовать модуль подпроцесса для захвата 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)
3 голосов
/ 01 августа 2011

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

...