好的,这是一项简单的任务。在我将html呈现给客户端之后,我想使用来自请求的信息执行db调用。
我正在使用sinatra,因为它是一个轻量级的微框架,但是如果它更快/更容易(Rack?),我真的可以用于ruby中的任何东西。我只想获取网址并根据网址将客户端重定向到其他位置。
那么如何使用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中发送响应之后才真正运行。
感谢您阅读或回答我的问题! : - )
答案 0 :(得分:5)
将run_later端口修改为rails以执行文件可用的技巧:
http://github.com/pmamediagroup/sinatra_run_later/tree/master