目录
二、自定义速率限制超出的响应 - 默认html格式&json格式
5-1 全局 + 局部(无ip控制)+ 全局信号(ip控制)
一、flask-limiter - 第三方控频插件
from flask import Flask, request, make_response, jsonify from flask_limiter import Limiter from flask_limiter.util import get_remote_address import mysettings app = Flask(__name__) """ 默认的限制器 key_func参数是判断函数,表示以何种条件判断算一次访问?这里使用的是get_remote_address,此函数返回的是客户端的访问地址. default_limits 是一个数组,用于依次提同判断条件.比如100/day是指一天100次访问限制. 常用的访问限制字符串格式如下: 10 per hour 10/hour 10/hour;100/day;2000 per year 100/day, 500/7days 注意默认的限制器对所有视图都有效,除非你自定义一个限制器用来覆盖默认限制器,或者使用limiter.exempt装饰器来取消限制 """ limiter = Limiter( app, key_func=get_remote_address, default_limits=["1 per day", "2 per hour"] ) @app.route("/slow") @limiter.limit("1 per day") def slow(): return "24" # 默认使用全局限制器 @app.route("/fast") def fast(): return "42" @app.route("/ping") @limiter.exempt # 取消默认的全局限制器 def ping(): return "PONG" # 从配置文件获取访问速率 def rate_limit_from_config(): # return mysettings.get("CUSTOM_LIMIT", "10/s") return getattr(mysettings, 'CUSTOM_LIMIT', "10/s") @app.route("/test") @limiter.limit(rate_limit_from_config, error_message='sorry you have too many requests') def my_route(): return 'test success' # 返回Json格式数据 @app.errorhandler(429) def ratelimit_handler(e): return make_response( jsonify(error="ratelimit exceeded %s" % e.description) , 429 ) if __name__ == '__main__': app.run()
二、自定义速率限制超出的响应 - 默认html格式&json格式
2-1 h