Sinatra and session variables which are not being set

徘徊边缘 提交于 2020-01-12 03:32:09

问题


For some reason, session variables are not being set in my app. I am using Sinatra 1.2.1.

Here is a piece of code:

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

As you can see, session[:user] is not being set, or rather the session hash is being reset after each request. Does anybody know what is going on please?


回答1:


If you're using Shotgun, add the following line to the configure block:

set :session_secret, "My session secret"

To quote from rkh, Sinatra's current maintainer:

[Shotgun] will restart the server on every request, thereby regenerate the session secret and thus invalidate your sessions. This has been fixed in current master. Simple fix: set the session_secret option.

NOTE: This fix doesn't work if you use Rack::Session::Pool



来源:https://stackoverflow.com/questions/5631862/sinatra-and-session-variables-which-are-not-being-set

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!