使用 Chameleon ZPT 模板写出打印语句

发布于 2024-11-27 06:19:11 字数 389 浏览 0 评论 0原文

我正在使用金字塔,我知道这可能不是首选的做事方式,但它真的很酷。我有一堆可以打印到标准输出的 Python 脚本。现在我想将这些脚本作为 Pyramid 中请求/响应的一部分运行。我的意思是我想捕获脚本的标准输出并将其写入模板。

捕获标准输出部分非常简单:

import sys
sys.stdout = tbd

据我所知,render_to_response 不支持以下任何内容:

return render_to_response(’templates/foo.pt’,
    {’foo’:1, ’bar’:2},
    request=request)

知道如何在模板上进行 write() 操作吗?

I am using Pyramid and I know that this is probably not the preferred way to do things but it would be really cool. I have a bunch of Python scripts which print to stdout. Now I want to run these scripts as part of a request/ response in Pyramid. I mean I want to capture the stdout of the scripts and write it to the template.

The capturing stdout part is pretty easy:

import sys
sys.stdout = tbd

As far as I can see render_to_response does not support any of this:

return render_to_response(’templates/foo.pt’,
    {’foo’:1, ’bar’:2},
    request=request)

Any idea how I can get a write() operation on the template?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千秋岁 2024-12-04 06:19:11

我可能会使用 subprocess 模块来捕获脚本的标准输出,而不是导入它并直接运行它:

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)

I might use the subprocess module to capture the stdout of the script instead of importing it and running it directly:

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)
沒落の蓅哖 2024-12-04 06:19:11

您可以将 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>

您可能会需要添加一个过滤器以确保文本格式正确,或者您可能只是使用 __html__ 方法创建 StringIO.StringIO 的子类,该方法将按照您认为合适的方式呈现内容。

You could pass a StringIO.StringIO object to stdout, then also pass it to the template via the context dictionary and just call StringIO.StringIO.getvalue() at the proper times in the template:

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)

and then in the template:

<html>
  <body>
    <!-- stuff -->
    ${stdout.getvalue()}
    <!-- other stuff -->
  </body>
</html>

You'll probably need to add a filter to make sure the text is formatted properly, or you might just create a subclass of StringIO.StringIO with an __html__ method that would render things as you see fit.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文