我正在研究Sinatra项目,并在会话中设置了一些变量供以后使用。
我需要帮助的场景是我想访问中间件类中的会话对象。我正在使用warden进行身份验证。
我想在Middleware类中执行类似的操作:
class MyMiddleware
def initialize(app, options={})
@app = app
end
def call(env)
puts "#{session.inspect}"
end
end
是否有可能这样做?
思想?
答案 0 :(得分:8)
您不能在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
答案 1 :(得分:0)
对我来说,matt 的回答有效,但我必须确保我在 sinatra 中的 use
语句的顺序正确。 cookie 声明必须在我的中间件之前:
class ApiDocs < Sinatra::Base
use Rack::Session::Cookie, ... #etc
use MyMiddleware # my middleware that uses session