From 4903ab757cff8a6b589f4d800e5559233b620d51 Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Fri, 10 Nov 2023 14:56:52 -0500 Subject: [PATCH] Add --hourly-req-limit --- libretranslate/app.py | 14 ++++++++++---- libretranslate/default_values.py | 5 +++++ libretranslate/main.py | 7 +++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/libretranslate/app.py b/libretranslate/app.py index eb4fafe..8eb984c 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -103,7 +103,7 @@ def get_req_limits(default_limit, api_keys_db, multiplier=1): return req_limit -def get_routes_limits(default_req_limit, daily_req_limit, api_keys_db): +def get_routes_limits(default_req_limit, hourly_req_limit, daily_req_limit, api_keys_db): if default_req_limit == -1: # TODO: better way? default_req_limit = 9999999999999 @@ -111,11 +111,17 @@ def get_routes_limits(default_req_limit, daily_req_limit, api_keys_db): def minute_limits(): return "%s per minute" % get_req_limits(default_req_limit, api_keys_db) + def hourly_limits(): + return "%s per hour" % get_req_limits(hourly_req_limit, api_keys_db, int(os.environ.get("LT_HOURLY_REQ_LIMIT_MULTIPLIER", 60))) + def daily_limits(): - return "%s per day" % get_req_limits(daily_req_limit, api_keys_db, 1440) + return "%s per day" % get_req_limits(daily_req_limit, api_keys_db, int(os.environ.get("LT_DAILY_REQ_LIMIT_MULTIPLIER", 1440))) res = [minute_limits] + if hourly_req_limit > 0: + res.append(hourly_limits) + if daily_req_limit > 0: res.append(daily_limits) @@ -186,7 +192,7 @@ def create_app(args): api_keys_db = None - if args.req_limit > 0 or args.api_keys or args.daily_req_limit > 0: + if args.req_limit > 0 or args.api_keys or args.daily_req_limit > 0 or args.hourly_req_limit > 0: api_keys_db = None if args.api_keys: api_keys_db = RemoteDatabase(args.api_keys_remote) if args.api_keys_remote else Database(args.api_keys_db_path) @@ -196,7 +202,7 @@ def create_app(args): limiter = Limiter( key_func=get_remote_address, default_limits=get_routes_limits( - args.req_limit, args.daily_req_limit, api_keys_db + args.req_limit, args.hourly_req_limit, args.daily_req_limit, api_keys_db ), storage_uri=args.req_limit_storage, ) diff --git a/libretranslate/default_values.py b/libretranslate/default_values.py index df058a3..2f44bba 100644 --- a/libretranslate/default_values.py +++ b/libretranslate/default_values.py @@ -61,6 +61,11 @@ _default_options_objects = [ 'default_value': 'memory://', 'value_type': 'str' }, + { + 'name': 'HOURLY_REQ_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, { 'name': 'DAILY_REQ_LIMIT', 'default_value': -1, diff --git a/libretranslate/main.py b/libretranslate/main.py index 84589d3..8865379 100644 --- a/libretranslate/main.py +++ b/libretranslate/main.py @@ -35,6 +35,13 @@ def get_args(): metavar="", help="Storage URI to use for request limit data storage. See https://flask-limiter.readthedocs.io/en/stable/configuration.html. (%(default)s)", ) + parser.add_argument( + "--hourly-req-limit", + default=DEFARGS['HOURLY_REQ_LIMIT'], + type=int, + metavar="", + help="Set the default maximum number of requests per hour per client, in addition to req-limit. (%(default)s)", + ) parser.add_argument( "--daily-req-limit", default=DEFARGS['DAILY_REQ_LIMIT'],