我有一个 Sinatra 应用程序,它有一个长时间运行的进程(网络抓取工具)。我希望应用程序在爬虫运行时而不是在结束时刷新爬虫进度的结果。
我已经考虑过 fork 请求并使用 ajax 做一些有趣的事情,但这是一个非常基本的单页应用程序,实际上只需要在它发生时将日志输出到浏览器。有什么建议吗?
最佳答案
更新 (2012-03-21)
从 Sinatra 1.3.0 开始,您可以使用新的流式 API:
get '/' do
stream do |out|
out << "foo\n"
sleep 10
out << "bar\n"
end
end
旧答案
不幸的是,您没有可以简单地刷新到的流(这不适用于 Rack 中间件)。从路由 block 返回的结果可以简单地响应 each
。然后,Rack 处理程序将使用一个 block 调用 each
,并在该 block 中将正文的给定部分刷新到客户端。
所有 rack 响应都必须始终响应 each
并始终将字符串传递给给定的 block 。如果您只返回一个字符串,Sinatra 会为您处理这件事。
一个简单的流式传输示例是:
require 'sinatra'
get '/' do
result = ["this", " takes", " some", " time"]
class << result
def each
super do |str|
yield str
sleep 0.3
end
end
end
result
end
现在您可以简单地将所有抓取放在 each
方法中:
require 'sinatra'
class Crawler
def initialize(url)
@url = url
end
def each
yield "opening url\n"
result = open @url
yield "seaching for foo\n"
if result.include? "foo"
yield "found it\n"
else
yield "not there, sorry\n"
end
end
end
get '/' do
Crawler.new 'http://mysite'
end
关于ruby - 有没有办法将 html 刷新到 Sinatra 中的线路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027435/