目录
二、自定义速率限制超出的响应 - 默认html格式&json格式
一、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 html格式响应
默认配置导致每次超过特定路由的速率限制时调用中止(429)。超出的限制将添加到响应中,并导致响应正文如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>429 Too Many Requests</title> <h1>Too Many Requests</h1> <p>1 per 1 day</p>
2-2 Json格式响应
Json格式 - 如果要配置响应,可以以类似于以下示例的方式为429错误代码注册错误处理程序,该示例将返回json响应
@app.errorhandler(429) def ratelimit_handler(e): return make_response( jsonify(error="ratelimit exceeded %s" % e.description) , 429 )
三、基于CBV的限频方式
如果您使用基于类的方法来定义视图函数,则装饰视图函数以应用每个路径速率限制的常规方法将不起作用。
您可以使用以下方法为视图类添加速率限制。
app = Flask(__name__) limiter = Limiter(app, key_func=get_remote_address) class MyView(flask.views.MethodView): decorators = [limiter.limit("10/second")] def get(self): return "get" def put(self): return "put"
!!!注意!!!
这种方法仅限于任一共享相同的速率限制的所有HTTP方法给定的 flask.views.View 或独立地将所述声明速率限制为每个HTTP方法(做到这一点,通过在
True
向per_method
关键字参数 Limiter.limit() )。或者,可以通过将限制作为列表传递给methods 关键字参数,将限制仅限于某些http方法。