Я следую документам , для динамически загружаемых лимитных строк. По сути, я пытаюсь внедрить RATE LIMIT для конкретной компании.
Ниже приводится модель компании:
# company model
class Company(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True)
limit = db.Column(db.String(50), default=DEFAULT_LIMIT)
def __init__(self, name, limit):
self.name = name
self.limit = limit
это мой лимитер.py:
DEFAULT_LIMIT = "100/day, 10/minute"
app = Flask(__name__)
# defining limiter
limiter = Limiter(
app,
key_func=get_remote_address,
default_limits=[DEFAULT_LIMIT] # this is default limit set for app
)
def get_company_limit():
try:
company = Company.query.get(request.view_args['id'])
return app.config.get("CUSTOM_LIMIT", company.limit)
except:
abort(403) # if company not found then raise forbidden
# an end point
@app.route("/company/<id>", methods=["GET"])
@limiter.limit(get_company_limit)
def get_company(id):
return "success"
if __name__ == '__main__':
app.run(debug=True)
предположим, что это компании:
[
{
"name": "company1"
"limit": "100/day, 5/minute",
},
{
"name": "company2"
"limit": "100/day, 10/minute",
},
{
"name": "company3"
"limit": "50/day, 5/minute",
},
{
"name": "company4"
"limit": "100/day, 2/minute",
}
]
ПРОБЛЕМА:
Динамически извлекаемый лимит работает нормально с компаньонами 1, 2 и 4. Но, как вы можете видеть, есть некоторый совпадающий лимит (5 в минуту) для company1 и company3, лимит разделяется для этих компаний независимо от порядка вызова API-конца точка. При достижении конечной точки компания1 и компания3 делят счетчик лимита 5.
Например, если конечная точка вызывается с идентификатором company1 3 раза, при вызове с идентификатором company3 после 2 успешных ответов ограничитель повысит 429. А также увеличит 429 для company1.
Невозможно понять это поведение и что я упустил, чтобы понять это?