访问Sinatra中间件中的会话



我正在处理一个Sinatra项目,并在会话中设置了一些变量以备日后使用。

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

我想在中间件类中做一些类似的事情:

class MyMiddleware
    def initialize(app, options={})
        @app = app
    end
    def call(env)
        puts "#{session.inspect}" 
    end
end

有可能这样做吗?

想法?

您不能在Rack中间件中使用Sinatra的session方法,但可以通过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

您可能更喜欢使用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

对我来说,matt的答案有效,但我必须确保我在sinatra中的use语句顺序正确。cookie声明必须出现在我的中间件之前:

class ApiDocs < Sinatra::Base
use Rack::Session::Cookie, ... #etc
use MyMiddleware # my middleware that uses session

最新更新