Flask - flask-limiter - 第三方控频插件

目录

一、flask-limiter - 第三方控频插件

二、自定义速率限制超出的响应 - 默认html格式&json格式

2-1 html格式响应

2-2 Json格式响应

三、基于CBV的限频方式


一、flask-limiter - 第三方控频插件

官方文档

基于FBV的简单使用

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方法(做到这一点,通过在Trueper_method关键字参数 Limiter.limit() )。或者,可以通过将限制作为列表传递给methods 关键字参数,将限制仅限于某些http方法。

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/88819533