7

好的,这是一个简单的任务。在将 html 呈现给客户端后,我想使用请求中的信息执行 db 调用。

我正在使用 sinatra,因为它是一个轻量级的微框架,但如果它更快/更容易(机架?),我真的很喜欢 ruby​​ 中的任何东西。我只想获取 url 并根据 url 将客户端重定向到其他地方。

那么,如何使用 rack/sinatra 作为一个真正的 after_filter。而 after_filter 我的意思是在响应发送到客户端之后。还是没有线程就无法实现?

我分叉了 sinatra 并添加了过滤器,但是没有办法刷新响应,即使是假设流文件(显然是二进制文件)的 send_data 也会等待 after_filters。

我见过这个问题:Multipart-response-in-ruby,但答案是针对rails的。而且我不确定它是否真的刷新了对客户端的响应,然后允许之后进行处理。

Rack::Callbacks 在回调之前和之后都有一些回调,但即使是那些看起来它们会在响应发送到客户端之前运行这里的Rack::Callbacks实现(添加评论):

def call(env)
  @before.each {|c| c.call(env) }
  response = @app.call(env)
  @after.each {|c| c.call(env) }
  response 
  #i am guessing when this method returns then the response is sent to the client.
end

所以我知道我可以用 rake 通过 shell 调用后台任务。但是最好不要太...还有NeverBlock但这对于执行单独的进程而不延迟响应是否有好处,或者它仍然会使应用程序整体等待(我认为它会)?

我知道这很多,但简而言之,它是在 ruby​​/sinatra/rack 中发送响应之后真正运行的简单 after_filter。

感谢您阅读或回答我的问题!:-)

4

1 回答 1

5

将 run_later 端口修改为 rails 以实现该文件在此处可用的技巧:

http://github.com/pmamediagroup/sinatra_run_later/tree/master

于 2009-02-05T23:33:44.280 回答