2012-10-01 16 views

Trả lời

15

Tôi đã thành công tốt với Rack::Throttle để hạn chế tốc độ. Phân lớp một trong các lớp điều khiển tích hợp và quá tải phương thức allowed?. Logic tùy chỉnh của bạn có thể kiểm tra bộ điều khiển nào đang được truy cập và áp dụng giới hạn tốc độ khi cần.

class ApiThrottle < Rack::Throttle::Hourly 
    ## 
    # Returns `false` if the rate limit has been exceeded for the given 
    # `request`, or `true` otherwise. 
    # 
    # Rate limits are only imposed on the "api" controller 
    # 
    # @param [Rack::Request] request 
    # @return [Boolean] 
    def allowed?(request) 
    path_info = (Rails.application.routes.recognize_path request.url rescue {}) || {} 

    # Check if this route should be rate-limited 
    if path_info[:controller] == "api" 
     super 
    else 
     # other routes are not throttled, so we allow them 
     true 
    end 
    end 
end 
5

Thêm vào câu trả lời Ian, để thiết lập lên ApiThrottle bạn phải:

# application.rb 
require 'rack/throttle' 
class Application < Rails::Application 
    ... 
    config.require "api_throttle" 
    # max 100 requests per hour per ip 
    config.middleware.use ApiThrottle, :max => 100 
    ... 
end 

# /lib/api_throttle.rb 
# Ian's code here 

Một điều quan trọng cần thêm là, đối với tôi, những path_info[:controller] được đưa ra khi "api/v1/cities" và không chỉ như "api". Tất nhiên, đó là do cấu hình không gian tên. Vì vậy, hãy cẩn thận khi thiết lập bộ điều chỉnh.

0

Bạn cũng có thể (bây giờ) sử dụng Rails Engine để tạo một bộ tuyến đường riêng biệt bổ sung phần mềm trung gian bổ sung vào ngăn xếp cho các tuyến được gắn kết của nó.

Xem https://stackoverflow.com/a/41515577/79079

(Đáng tiếc là tôi thấy câu hỏi này trong khi tìm kiếm để xem nếu có cách đơn giản nào để làm điều đó. Viết một middleware tùy chỉnh cho mỗi middleware mà tôi muốn thêm dường như nhiều hơn tròn về vì sử dụng a Rails :: Engine)

Các vấn đề liên quan