我正在处理一个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