如何将STDOUT重定向到sinatra网页

时间:2015-10-22 11:04:25

标签: ruby http sinatra stdout

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

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

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

使用sinatra来传输stdout(不适合我): 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重定向到构建页面......这怎么可能?

Travis-CI build page

更新

感谢迄今为止的帮助,我有一个半途而废的解决方案。我目前正在将$stdout保存到StringIO的新实例并在之后显示它。但是,这不是答案。对于长时间运行的脚本(即.travis-ci build),等待整个脚本完成然后显示$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

1 个答案:

答案 0 :(得分:0)

您可以使用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