好的,这是一个简单的任务。在我向客户端呈现 html 之后,我想使用请求中的信息执行数据库调用。
我正在使用 sinatra,因为它是一个轻量级的微框架,但我真的支持 ruby 中的任何东西,如果它更快/更容易(Rack?)。我只想获取 url 并根据 url 将客户端重定向到其他地方。
那么如何使用 rack/sinatra 作为一个真正的 after_filter。 after_filter 我的意思是在响应发送到客户端之后。还是没有线程就无法实现?
我 fork 了 sinatra 并在过滤器之后添加,但是没有办法刷新响应,即使是假设流式传输文件(显然是二进制文件)的 send_data 也在等待 after_filters。
我看过这个问题:Multipart-response-in-ruby但答案是铁轨。而且我不确定它是否真的将响应刷新到客户端,然后允许事后处理。
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 很简单。
感谢阅读或回答我的问题! :-)
最佳答案
将 run_later 端口修改为 rails 以执行此操作文件可在此处获得:
http://github.com/pmamediagroup/sinatra_run_later/tree/master
关于ruby - 真正的 sinatra(ruby/rack) after_filter 最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513491/