【问题标题】:What's the fastest way for a true sinatra(ruby/rack) after_filter?真正的 sinatra(ruby/rack) after_filter 的最快方法是什么?
【发布时间】:2009-02-04 21:39:51
【问题描述】:

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

我使用 sinatra 是因为它是一个轻量级的微框架,但如果它更快/更容易(Rack?),我真的很喜欢 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,但这对于在不延迟响应的情况下执行单独的进程是否有好处,或者它仍然会使应用程序整体等待(我认为它会)?

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

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

【问题讨论】:

    标签: ruby performance sinatra callback


    【解决方案1】:

    修改了 run_later 到 rails 的端口来做这个文件在这里可用:

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

    【讨论】:

    • 该网址无效。我相信它已更新为github.com/pmamediagroup/sinatra_run_later/tree/master
    • 这不再是必要的! :-) 是的!!! Jimmy Schementi 在 1.0 版中向 Sinatra 添加了过滤器后工作(虽然我还没有验证这一点)检查更改@@github.com/sinatra/sinatra/blob/master/CHANGES
    • 不正确; Sinatra 的after 过滤器在路由之后运行,但在响应发送给用户之前(允许您修改响应的最后机会)。
    • 感谢@Phrogz 指出这一点!那么 sinatra_run_later 呢?
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2011-09-26
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多