我之前已经看到过这个问题,但我很想知道使用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重定向到构建页面......这怎么可能?
更新
感谢迄今为止的帮助,我有一个半途而废的解决方案。我目前正在将$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
答案 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