2011-04-12 149 views
10

由於某些原因,會話變量未在我的應用程序中設置。我正在使用Sinatra 1.2.1。Sinatra和未設置的會話變量

這裏是一段代碼:

module GitWiki 
    class App < Sinatra::Base 

    configure do 
     enable :sessions 

     set :app_file, __FILE__ 
     set :root, File.expand_path(File.join(File.dirname(__FILE__), '..', '..')) 

     set :auth do |bool| 
     condition do 
      redirect '/login' unless logged_in? 
     end 
     end 
    end 

    helpers do 
     def logged_in? 
     not @user.nil? 
     end 
    end 

    error PageNotFound do 
     page = request.env["sinatra.error"].name 
     redirect "/#{page}/edit" 
    end 

    before do 
     content_type "text/html", :charset => "utf-8" 
     @user = session[:user] 
    end 

    get "/login/?" do 
     erb :login 
    end 

    post "/login" do 
     user = User.get 
     if user.authenticate(params[:username], params[:password]) 
     session[:user] = params[:username] 
     p session # => {:user=>"root"} 
     else 
     # AZIZ! LIGHT! 
     end 

     redirect '/' 
    end 

    get "/" do 
     p session # => {} 
     redirect "/" + GitWiki.homepage 
    end 

    # ... 
    end 
end 

正如你可以看到,session[:user]沒有被置位,或者更確切地說,該會話散列正在復位在每個請求之後。有人知道發生了什麼事嗎?

回答

26

如果您使用獵槍,以下行添加到配置塊:

set :session_secret, "My session secret" 

從RKH引用,Sinatra的當前的維護者:

[霰彈槍]將重新啓動服務器上每個請求,從而重新生成會話密鑰,從而使會話失效。這在當前的主人已經修復。簡單修復:設置session_secret選項。

注意:如果您使用Rack::Session::Pool

+0

從Sinatra的文檔此修復程序不起作用:「不過,因爲這個祕密將與您的應用程序的每一個開始改變,你可能需要設置祕密自己......「 – imwilsonxu 2012-09-05 09:56:23

+0

好多了,謝謝aziz。 – pje 2012-11-22 06:01:35

+0

我喜歡「NOTE」,你碰巧知道誰用Rack :: Session :: Pool來解決這個問題嗎? – 2014-10-30 10:43:46