【发布时间】:2021-06-04 10:50:39
【问题描述】:
我正在使用 Flask 和 connexion 构建一个 REST API。 (Python)
我正在使用 swagger.yml 文件将 api 添加到 connexion 应用程序,该文件包含所有端点、方法等的定义...
问题是,如何为特定资源/路由/调用添加速率限制?
我似乎在文档中找不到它。
谢谢。
【问题讨论】:
标签: python rest flask rate-limiting connexion
我正在使用 Flask 和 connexion 构建一个 REST API。 (Python)
我正在使用 swagger.yml 文件将 api 添加到 connexion 应用程序,该文件包含所有端点、方法等的定义...
问题是,如何为特定资源/路由/调用添加速率限制?
我似乎在文档中找不到它。
谢谢。
【问题讨论】:
标签: python rest flask rate-limiting connexion
Connexion 是一个烧瓶应用程序,因此许多与烧瓶一起使用的技术都与 connexion 一起使用。
我们成功使用Flask-Limter 进行限速。
import os
import connexion
APP = connexion.FlaskApp(
__name__, specification_dir=os.environ.get("OPENAPI_LOCATION", ".")
)
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
import service.global_app as global_app
# This is for rate limiting (flask-limiter)
# Ref: https://limits.readthedocs.io/en/stable/storage.html#storage-scheme
APP.app.config["RATELIMIT_STORAGE_URI"] = (
"redis://" f"{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB + 1}"
)
# Kill switch for rate limiter
APP.app.config["RATELIMIT_ENABLED"] = True
# Policy for what to do if REDIS is down
APP.app.config["RATELIMIT_IN_MEMORY_FALLBACK"] = True
APP.app.config["RATELIMIT_HEADERS_ENABLED"] = True
APP.app.config["RATELIMIT_SWALLOW_ERRORS"] = os.environ.get("ENV", "") != "DEV"
LIMITER = Limiter(
global_app.APP.app,
key_func=get_remote_address,
# 1
default_limits=[DAILY_LIMIT, HOURLY_LIMIT],
)
@LIMITER.limit("3/second", override_defaults=True, exempt_when=exempt_when)
def simple_search_dsl_async(
) -> str:
return "Hi"
【讨论】:
您可以将 X-Rate-Limit-* HTTP 标头与 http 429 状态代码一起使用。
这实际上看起来像在 openapi 中:
....
responses:
"200":
description: Success response
content:
application/json:
schema:
$ref: "#/components/schemas/YourResponseModel"
headers:
"X-Rate-Limit-Limit": {
"description": "The number of allowed requests in the current period",
"schema": {
"type": "integer"
}
} ,
"X-Rate-Limit-Remaining": {
"description": "The number of remaining requests in the current period",
"schema": {
"type": "integer"
}
},
"X-Rate-Limit-Reset": {
"description": "The number of seconds left in the current period",
"schema": {
"type": "integer"
}
}
"429":
description: Too many requests
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorMessageResponse"
....
【讨论】: