2012-10-01 17 views
9

क्या केवल विशिष्ट रेल मार्गों पर रैक मिडलवेयर को ट्रिगर करना संभव है?विशिष्ट रेल मार्गों पर ट्रिगर रैक मिडलवेयर

उदाहरण के लिए, मान लीजिए कि मैं केवल एपी नेमस्पेस पर रेट लिमिटर मिडलवेयर चलाने के लिए चाहता हूं।

namespace :api do 
    resources :users 
end 

उत्तर

15

मुझे दर सीमित करने के लिए Rack::Throttle के साथ अच्छी सफलता मिली है। बिल्ट-इन थ्रॉटल क्लासेस में से एक को उपclass और allowed? विधि अधिभारित करें। आपका कस्टम तर्क जांच सकता है कि कौन से नियंत्रक का उपयोग किया जा रहा है और आवश्यकतानुसार दर सीमा लागू करें।

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

इयान के जवाब देने के लिए जोड़ा जा रहा है, ApiThrottle अप सेटअप करने के लिए आपके पास करने के लिए:

# 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 

एक महत्वपूर्ण जोड़ने के लिए बात यह है कि, मेरे लिए, path_info[:controller]"api/v1/cities" के रूप में आया था और न केवल "api" के रूप में। बेशक, यह नामस्थान विन्यास के कारण है। इसलिए, थ्रॉटलर की स्थापना करते समय सावधानी बरतें।

0

आप (अब) रेलवे इंजन का उपयोग मार्गों के एक अलग सेट को बनाने के लिए कर सकते हैं जो इसके घुड़सवार मार्गों के लिए ढेर में अतिरिक्त मिडलवेयर जोड़ता है।

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

(दुर्भाग्य से मैं इस सवाल है, जबकि अगर वहाँ यह करने के लिए किसी भी सरल तरीके से। हर मिडलवेयर है कि मैं जोड़ना चाहते थे के लिए एक कस्टम मिडलवेयर लिख रहा था देखने के लिए देख पाया देखें का उपयोग करने से लगता है और भी अधिक राउंड के बारे में एक रेल :: इंजन)

संबंधित मुद्दे