访问Sinatra Middleware中的会话

Has*_*han 4 ruby session rack sinatra warden

我正在研究Sinatra项目,并在会话中设置了一些变量供以后使用.

我需要帮助的场景是我想访问中间件类中的会话对象.我正在使用warden进行身份验证.

我想在Middleware类中做类似的事情:

class MyMiddleware
    def initialize(app, options={})
        @app = app
    end

    def call(env)
        puts "#{session.inspect}" 
    end
end
Run Code Online (Sandbox Code Playgroud)

这样做有可能吗?

思考?

mat*_*att 8

您不能session在Rack中间件中使用Sinatra的方法,但您可以通过env哈希直接访问会话.

确保会话中间件位于中间件之前(因此Sinatra enable :sessions应该在之前use MyMiddleware),然后通过密钥可以获得会话'rack.session':

class MyMiddleware
  def initialize(app, options={})
    @app = app
  end

  def call(env)
    puts env['rack.session'].inspect
    @app.call(env)
  end
end
Run Code Online (Sandbox Code Playgroud)

您可能更喜欢使用Rack::Request对象来更轻松地访问会话和env哈希的其他部分:

def call(env)
  request = Rack::Request.new(env)
  puts request.session.inspect
  # other uses of request without needing to know what keys of env you need
  @app.call(env)
end
Run Code Online (Sandbox Code Playgroud)