【问题标题】:How to redirect STDOUT to sinatra webpage如何将 STDOUT 重定向到 sinatra 网页
【发布时间】:2015-10-22 11:04:24
【问题描述】:

我之前看到过这个问题,但我很好奇使用 sinatra 来完成这个问题。认识到sinatra already has a streaming method,我认为解决方案已经完成了 80%。

这些是一些类似的问题供参考:

通用重定向标准输出: Streaming stdout to a web page

使用 sinatra 流式传输标准输出(不适用于我): Sinatra 1.3 Streaming w/ Ruby stdout redirection

这是我想要完成的一个示例(为清楚起见进行了简化):

require 'sinatra'
require 'thin'

get '/' do
  stream do |out|
    out << method_that_puts
  end
end

def method_that_puts
  puts 'I would like...'
  sleep 1.0
  puts 'to display this...'
  sleep 1.0
  puts 'on a web page!'
end

编辑: 最好的例子是 travis-ci,它是 also built with sinatra。他们正在将标准输出重定向到构建页面......这怎么可能?

更新:

感谢到目前为止的帮助,我有一个半途而废的解决方案。我目前正在将$stdout 保存到StringIO 的新实例中,然后再显示它。但是,这不是答案。对于长时间运行的脚本(即 travis-ci 构建),等待整个脚本完成然后显示 $stdout 是荒谬的。需要弄清楚如何在它出现时对其进行流式传输......

这是我目前所拥有的:

foo = StringIO.new
$stdout = foo

get '/' do
  stream do |out|
    method_that_puts
    out.puts $stdout.string
  end
end

def method_that_puts
  puts 'I would like...'
  sleep 1.0
  puts 'to display this...'
  sleep 1.0
  puts 'on a web page!'
end

【问题讨论】:

  • Ruby Sinatra 是服务器端,这意味着你不能像那样不刷新就更新页面。要么刷新,要么可以使用客户端 JavaScript 或 jQuery,这比您想象的要容易。此外,要将输出定向到网页,您必须将值嵌入 *.erb 文件并运行 WEBrick 服务器或使用主机。
  • 你确定这不可能吗?我的印象是可以为特定路线处理流,并在流中仍有数据时继续“加载”。没有刷新——这是页面的初始加载。
  • 捕获输出并将其作为视图值提供。
  • 可以实时做到吗?我想也许将$stdout 保存到一个变量并传递给一个视图,但它不会同时显示method_that_pus。
  • 据我所知,由于 Ruby Sinatra 是服务器端,因此没有这样的方法可以完成您想要完成的任务。如果您想要更新,请使用客户端 Javascript。

标签: ruby http sinatra stdout


【解决方案1】:

您可以使用Sinatra::Streaming(来自sinatra-contrib gem),它提供了一个您可以写入的输出对象。

这是文档中的示例:

get '/' do
  stream do |out|
    out.puts "Hello World!", "How are you?"
    out.write "Written #{out.pos} bytes so far!\n"
    out.putc(65) unless out.closed?
    out.flush
  end
end

【讨论】:

  • 不错。这绝对是正确的方向。我仍然不知道如何输出method_that_puts 的输出。 out.method_that_puts 只是输出返回的内容 -- nil。
  • 坏主意是$stdout = out,它将所有puts 输出重定向到您的响应。我真正的建议是简单地将out 传递给method_that_puts,然后在那里使用它。
  • 这是有道理的。这是我的困惑——这不需要我自己制定方法来传递参数吗?我正在使用我不拥有的宝石。例如,我正在尝试将 Sinatra 服务器日志嵌入到页面。
  • 如果你正在管道传输日志,也许窃取$stderr 并不是完全疯狂。我会尝试 file-tail 将您的文件尾随到流响应,或者您可以 set up the logger 使用该操作可以使用的共享 I/O 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2011-05-23
  • 2021-09-08
  • 2019-10-11
  • 2012-08-07
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多