Mik*_*aig 6 ruby session redirect thin sinatra
我正在尝试在Sinatra中使用重定向和会话来传递网站上的一些数据.这是一个简化的例子,使用PrettyPrint进行调试:
require 'pp'
require 'rubygems'
require 'sinatra'
enable :sessions
get '/' do
session[:foo] = '12345'
puts 'session1'
pp session
redirect to('/redir')
end
get '/redir' do
puts 'session2'
pp session
'hello world'
end
Run Code Online (Sandbox Code Playgroud)
看看Thin的输出,我看到:
>> Listening on 0.0.0.0:4567, CTRL+C to stop
session1
{"session_id"=>
"ea587d8afdcb2ada64f9b17cdd1fbae7b192dee5dfc2999ff9d323f1528f6a0f",
"foo"=>"12345"}
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET / HTTP/1.1" 302 - 0.0042
session2
{}
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET /redir HTTP/1.1" 200 11 0.0004
Run Code Online (Sandbox Code Playgroud)
我在文档中看到的一切都表明这应该可以正常工作.实际上,/redir
即使我直接请求会话数据,我也永远不会得到任何会话数据,并且会话会在后续请求中保持不变/
.
思考?
Tom*_*nza 12
FWIW,我不清楚为什么会这样,但是一旦我将我的Sinatra应用程序移动到多实例环境,我开始遇到大量问题,会话消失了.
最后,我发现使用这种语法有效,而简单的'enable:sessions'或'set:sessions,true'没有:
use Rack::Session::Cookie, :key => 'rack.session',
:path => '/',
:secret => 'your_secret'
Run Code Online (Sandbox Code Playgroud)
似乎在引用会话变量之前不会加载会话哈希。因此,例如,如果将重定向处理程序更改为:
get '/redir' do
puts 'session2'
puts session[:foo]
pp session
'hello world'
end
Run Code Online (Sandbox Code Playgroud)
我猜 Sinatra 是直接从 Rack 使用会话。快速浏览一下源代码就会发现,当调用 [] 方法(和其他方法)时,会话哈希会被延迟加载:
https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb