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

本文介绍了如何在Flask应用中使用flask-limiter第三方插件进行请求频率控制,包括自定义超出限制的响应(HTML和JSON格式)、基于CBV的限频、速率限制字符串表示法,以及利用信号实现IP黑名单的速率控制策略。
摘要由CSDN通过智能技术生成

目录

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

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

2-1 html格式响应

2-2 Json格式响应

三、基于CBV的限频方式

四、速率限制字符串表示法

五、Flask框架下,基于信号实现根据IP黑名单的速率控制

5-1 全局 + 局部(无ip控制)+ 全局信号(ip控制)

5-2 全局 + 局部(ip控制)+ 全局信号(ip控制)


一、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格式响应

默认配置导致每次超过特定路由的速率限制时调用中止

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值