6

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

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

私がドキュメントで見たものはすべて、これがうまくいくことを示唆しています。実際、/redir直接要求しても、 のセッション データを取得することはありません。その後の の要求では、期待どおりにセッションが持続します/

考え?

4

3 に答える 3

12

FWIW、これがなぜなのかはっきりしていませんが、Sinatra アプリをマルチインスタンス環境に移動すると、セッションが消えるという問題がたくさん発生し始めました。

最終的に、この構文を使用すると機能することがわかりましたが、単純な「enable :sessions」または「set :sessions, true」は機能しませんでした。

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :secret => 'your_secret'
于 2012-03-17T05:44:51.390 に答える
2

セッション変数が参照されるまで、セッション ハッシュが読み込まれないようです。したがって、たとえば、リダイレクト ハンドラを次のように変更すると、期待どおりの結果が得られます。

get '/redir' do
  puts 'session2'
  puts session[:foo]
  pp session
  'hello world'
end

Sinatra は Rack から直接セッションを使用していると思います。ソースをざっと見てみると、[] メソッド (およびその他のメソッド) が呼び出されると、セッション ハッシュが遅延ロードされることがわかります。

https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb

于 2011-07-19T16:52:10.350 に答える