Сеанс Shotgun sinatra [: значение] недоступен на разных маршрутах

#session #sinatra #shotgun

#сеанс #sinatra #shotgun

Вопрос:

Возьмите этот код (модульное приложение Sinatra)

 #application_controller.rb

require 'sinatra/base'
require "sinatra/activerecord"
require 'bcrypt'
require "sysrandom/securerandom"
include BCrypt
enable :sessions

    class Application < Sinatra::Base
    
        post '/identifier' do 
            user = User.find_by_email(params['email'])
            if user amp;amp; user.authenticate(params[:password]) 
                session[:babyami] = user.prenom 
                puts "after identification: #{session[:babyami]}"
                redirect to '/'
            else
                erb :'principal/identifier' 
            end
        end


        get '/' do
            puts "at root: #{session[:babyami]}"
        end
 

и в консоли, при использовании shotgun :

 == Shotgun/Thin on http://127.0.0.1:9393/
D, [2020-12-02T08:48:30.672731 #8992] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "moshe.man@gmail.com"], ["LIMIT", 1]]
after identification : Moshe
127.0.0.1 - - [02/Dec/2020:08:48:30  0100] "POST /identifier HTTP/1.1" 303 - 0.2239
at root: 
127.0.0.1 - - [02/Dec/2020:08:48:31  0100] "GET / HTTP/1.1" 200 - 0.0045

 

Но это работает, когда я использую rackup!

 $ rackup
2020-12-02 08:51:46  0100 Thin web server (v1.8.0 codename Possessed Pickle)

D, [2020-12-02T08:52:11.639346 #9165] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "moshe.man@gmail.com"], ["LIMIT", 1]]
after identification : Moshe
::1 - - [02/Dec/2020:08:52:11  0100] "POST /identifier HTTP/1.1" 303 - 0.2519
at root: Moshe
::1 - - [02/Dec/2020:08:52:11  0100] "GET / HTTP/1.1" 200 - 0.0009

 

Есть ли причина, по которой сеансы работают корректно при запуске rackup, но не при использовании shotgun? Как правильно включить сеансы с помощью shotgun?

Ответ №1:

Может ли это быть полезным.

shutgun перезапускает сервер при каждом запросе, поэтому сеанс теряется. Обходной путь — установить переменную ENV, как описано здесь: sinatra docs (не забудьте перезагрузиться)

и требует, чтобы этот секрет в приложении был таким:

 enable :sessions
set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
 

Смотрите также Здесь: обсуждение в Google