Sinatra基于数据库的会话

时间:2013-06-02 00:18:55

标签: session heroku sinatra

我目前正在将Sinatra与Heroku一起使用,唯一的同步是数据库。因此,我需要存储在数据库中的会话(希望不使用ActiveRecord)。

是否有Rack中间件或其他类似的东西?

2 个答案:

答案 0 :(得分:9)

您可以使用Moneta gem作为Sinatra的替代会话管理器。

直接从他们的GitHub页面:

  

Moneta提供了一个标准界面,用于与各种键/值存储进行交互......

将Moneta设置为Rack会话存储:

# in your config.ru
require 'rack/session/moneta'

# Use only the adapter name
use Rack::Session::Moneta, :store => :Redis

# Use Moneta.new
use Rack::Session::Moneta, :store => Moneta.new(:Memory, :expires => true)

# Use the Moneta builder
use Rack::Session::Moneta do
  use :Expires
  adapter :Memory
end

它适用于您能想到的几乎任何内容:基于文件和内存的存储,ActiveRecord,Sequel,DataMapper,Memcached,REDIS,CouchDB,MongoDB等。

更新

要详细说明与Rack应用的集成,我的config.ru是在Heroku上运行的生产网站上设置并使用Redis Cloud附加组件的方式:

if ENV['RACK_ENV'].to_sym == :production
    use Rack::Session::Moneta,
        key:            'domain.name',
        domain:         '.example.com',
        path:           '/',
        expire_after:   7*24*60*60, # one week
        secret:         ENV['PRODUCTION_SESSION_SECRET_KEY'],

        store:          Moneta.new(:Redis, {
            url:            ENV['REDISCLOUD_URL'],
            expires:        true,
            threadsafe:     true
        })
else
    use Rack::Session::Moneta,
        key:            'domain.name',
        domain:         '*',
        path:           '/',
        expire_after:   30*24*60*60, # one month
        secret:         ENV['DEV_SESSION_SECRET_KEY'],

        store:          Moneta.new(:Redis, {
            url:            ENV['DEV_REDIS_URL'],
            expires:        true,
            threadsafe:     true
        })
end

答案 1 :(得分:1)

您可以在Heroku上使用memcache add-on,而不是使用数据库进行会话存储。您可以在memcachier documentation

中阅读相关内容

Sinatra片段将memcache配置为会话存储

require 'rack/session/dalli'

mem_serv, mem_uname, mem_pword = ENV['MEMCACHIER_SERVERS'], ENV['MEMCACHIER_USERNAME'], ENV['MEMCACHIER_PASSWORD']
cache = Dalli::Client.new(mem_serv, {:username => mem_uname, :password => mem_pword})
use Rack::Session::Dalli, :cache => $cache

作为会话商店的IMO memcache比使用数据库更有意义。我能想到的其他替代方案是Redis作为会话存储。