一、以 FBV flask 超频flask_limiter异常为例
from flask import Flask, jsonify, make_response
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(
app,
key_func=get_remote_address,
# 默认限流频率
default_limits=["200 per day", "50 per hour"]
)
# 所有接口只要是次状态吗 就会走此方法
@app.errorhandler(429)
def ratelimit_handler(e):
return jsonify({"code": 429, "status": "faild", "msg": e.description})
@app.route("/")
@limiter.limit("1 per second")
def slow():
return jsonify({"code": 200, "status": "success"})
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, debug=True)
# 1、上诉频率限制说明:
# 可以使用自己选择的分隔符将多个速率限制组合起来
# 10 per hour
# 10/hour
# 10/hour;100/day;2000 per year
# 100/day, 500/7days
#
# 2、说明
# 1、默认通过请求的remote_address进行限制。
# 2、不加@limiter.limit()
# 默认限制为200次/天,50次/小时;适用于所有路线
# 3、多个装饰写法
# a、@limiter.limit("100/day", my_key_func)
# b、路由装饰下依次装饰
# @limiter.limit("100/day")
# @limiter.limit("10/hour")
# @limiter.limit("1/minute")
# 4、接触限流限制
# @limiter.exempt
二、已CBV为例
def custom_abord(http_status_code, *args, **kwargs):
# 只要http_status_code 为400, 报参数错误
if http_status_code == 400:
abort(CommonRes.failed(code=ResCode.PARAM.value, msg="params error"))
# 正常返回消息
return abort(http_status_code)
# 把flask_restful中的abort方法改为我们自己定义的方法
flask_restful.abort = custom_abord
class HelloTest(Resource):
def __init__(self):
self.parser = RequestParser()
self.parser.add_argument('id_code', type=int, required=True, help="随机字符串", location="args")
def get(self):
args = self.parser.parse_args()
id_code = args.get("id_code")
print(type(id_code))
sys_time = get_sys_time()
return jsonify(CommonRes.success(msg="hello", content={"sys_time": sys_time, "id_code": id_code}))
# 参数id_code为必要参数 如未传入怎会走自定义的abort