2

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

是否有 Rack 中间件或其他东西可以做到这一点?

4

2 回答 2

10

您可以将Monetagem用作 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应用程序的集成,这是在 Heroku 上运行并使用Redis Cloud插件config.ru的生产站点上设置my 的方式:

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
于 2013-06-04T01:23:22.557 回答
1

您可以在 Heroku上使用 memcache 插件,而不是使用数据库进行会话存储。您可以在memcachier 文档中了解它

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

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 作为会话存储。

于 2013-06-03T06:22:40.070 回答