Я использую rack-throttle
в качестве ограничивающего скорость двигателя в своем приложении 3 рельсов. Я создал свой собственный класс на основе Rack::Throttle::Interval
, чтобы определить пользовательскую логику ограничения скорости. Я проверяю, выполняется ли запрос для точного контроля и точного действия. Это отлично работает, если я сделаю запрос GET
. Однако, если я отправлю POST
, у меня возникнут некоторые проблемы.Дросселирование POST-запросов в приложении для рельсов
class CustomLimiter < Rack::Throttle::Interval
def allowed?(request)
path_info = Rails.application.routes.recognize_path request.url rescue path_info = {}
if path_info[:controller] == "some_controller" and path_info[:action] == "some_action"
super
else
true
end
end
end
Вот мои действия контроллера
def question
#user is redirected here
end
def check_answer
#some logic to check answer
redirect_to question_path
end
Мои маршруты
get "questions" => "application#question", :as => "question"
post "check_answer" => "application#check_answer", :as => "check_answer"
EDIT:
Проблема заключается в том, что POST
запросы приходят к применению, так что метод allowed?
называется , Но когда я звоню Rails.application.routes.recognize_path
, я получаю исключение Route set not finalized
. Как я могу запретить пользователю отправлять много почтовых запросов о точном действии точного управления с помощью rack-throttle
Связующее добавляют в application.rb
class Application < Rails::Application
#Set up rate limiting
config.require "ip_limiter"
config.require "ip_user_agent_limiter"
config.middleware.use IpLimiter, :min => 0.2
config.middleware.use IpUserAgentLimiter, :min => 2
end
Оба IpLimiter
и IpUserAgentLimiter
получены из пользовательский лимитер
Как вы вставить Rack :: Дроссельная :: Интервал в приложении? – shingara
@shingara он включен в 'application.rb' – RomanKapitonov
Разрешено? метод - вызов методом POST или нет? Можете ли вы заполнить ту часть, где вы добавляете это промежуточное ПО в свое приложение? – shingara