Проблема с динамически загружаемой лимитной строкой с использованием Flask-Limiter - PullRequest
0 голосов
/ 11 апреля 2019

Я следую документам , для динамически загружаемых лимитных строк. По сути, я пытаюсь внедрить 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.

Невозможно понять это поведение и что я упустил, чтобы понять это?

1 Ответ

0 голосов
/ 12 апреля 2019

Проблема с:

# defining limiter
limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=[DEFAULT_LIMIT] # this is default limit set for app
)

В основном здесь, get_remote_address используется как key_func, который сталкивается с каждым новым запросом. Для каждого запроса может возвращаться один и тот же удаленный адрес интерфейса клиента. Там нужен пользователь, определенный key_func для регулирования запроса.

def get_comany_id():
    return (Company.query.get(request.view_args['id']), 0)

# defining limiter
limiter = Limiter(
    app,
    key_func=get_comany_id,
    default_limits=[DEFAULT_LIMIT] # this is default limit set for app
)

И это сработало.

...