Сессии Синатры не сохраняются, как ожидалось - PullRequest
5 голосов
/ 19 июля 2011

Я пытаюсь использовать перенаправления и сеансы в Синатре для передачи некоторых данных по сайту.Вот упрощенный пример использования PrettyPrint для отладки:

require 'pp'

require 'rubygems'
require 'sinatra'

enable :sessions

get '/' do
  session[:foo] = '12345'

  puts 'session1'
  pp session

  redirect to('/redir')
end

get '/redir' do
  puts 'session2'
  pp session
  'hello world'
end

Глядя на вывод Thin, я вижу:

>> Listening on 0.0.0.0:4567, CTRL+C to stop
session1
{"session_id"=>
  "ea587d8afdcb2ada64f9b17cdd1fbae7b192dee5dfc2999ff9d323f1528f6a0f",
 "foo"=>"12345"}
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET / HTTP/1.1" 302 - 0.0042
session2
{}
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET /redir HTTP/1.1" 200 11 0.0004

Все, что я видел в документах, говорит о том, что это должно работать нормально,Фактически, я никогда не получаю никаких данных сеанса для /redir, даже если я запрашиваю их напрямую, и сеанс продолжается, как и следовало ожидать при последующих запросах для /.

Мысли?

Ответы [ 3 ]

11 голосов
/ 17 марта 2012

FWIW, мне не ясно, почему это так, но как только я переместил свое приложение Sinatra в среду с несколькими экземплярами, у меня начались тонны проблем с исчезновением сеанса.

В конце концов, я обнаружил, что использование этого синтаксиса сработало, в то время как простой «enable: session» или «set: session, true» не сделал:

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :secret => 'your_secret'
1 голос
/ 19 июля 2011

Кажется, что хэш сеанса не загружается, пока не будет указана переменная сеанса. Так, например, вы получите ожидаемый результат, если вы измените обработчик перенаправления на:

get '/redir' do
  puts 'session2'
  puts session[:foo]
  pp session
  'hello world'
end

Полагаю, Синатра использует сессию прямо из стойки. Быстрый взгляд на источник показывает, что хеш сессии лениво загружается при вызове метода [] и других:

https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb

0 голосов
/ 20 февраля 2018

Причина, по которой работал формат, опубликованный Томом Лианзой, заключается в том, что по умолчанию Sinatra использует

set :session_secret, SecureRandom.hex(64) Чтобы выбрать случайный секрет и поскольку существует несколько сред, каждая из них будет использовать разные секреты, что приведет к противоречивым файлам cookie. Конечно, его следует добавить как переменную среды или файл конфигурации, который не зарегистрирован в SVC.

Связанная с Синатрой проблема

...