Перед фильтром в Синатре вызывается цикл перенаправления - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть простой код:

require 'sinatra'

before  do
  redirect '/login'
end

get '/login' do
  'hello'
end

get '/test' do
  'should not show'
end

Это простое приложение должно перенаправлять каждый маршрут, включая /test на маршрут login.Вместо этого я получаю цикл перенаправления.

Я использую последнюю версию Sinatra 2.0.5.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Решение предлагается выше, но объяснение состоит в том, что redirect запускает браузер перенаправления, поэтому каждый раз процесс начинается снова при запуске.Для использования перенаправления на стороне сервера используйте call.Начиная с документов :

Запуск другого маршрута

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

get '/foo' do
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
  [status, headers, body.map(&:upcase)]
end

get '/bar' do
  "bar"
end

Обратите внимание, что в приведенном выше примере вы упростили бы тестирование и повысили производительность, просто переместив "bar" в помощника, используемого обоими / fooи /bar.

Если вы хотите, чтобы запрос отправлялся в тот же экземпляр приложения, а не в дубликат, используйте call!вместо вызова.

Ознакомьтесь со спецификацией стойки, если вы хотите узнать больше о вызове.

Следовательно, вам, вероятно, нужен помощник (или, более вероятно, условие ), если вы проверяете аутентификацию).

0 голосов
/ 04 февраля 2019

Вам необходимо исключить /login маршрут из before_filter

before do
  redirect '/login' if request.path_info != "/login"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...