flask限流插件flask_limiter使用介绍

  • 2025-03-31 13:37:02
  • 开发
  • 37
  • shevechco

Flask-Limiter是一个专为 Flask 应用设计的速率限制扩展程序,你可以根据提供的限流策略对自己web业务实施访问限制,实现整个web业务的流量管理功能。
接下来我们看看Flask-Limiter如何使用,首先我们先进行安装

pip install Flask-Limiter

在flask应用中使用flask_limiter有好几种方式,可以在蓝本中进行限流,在具体的视图函数中使用限流
限流频率的几种表现形式,可以多个策略叠加或者混用

10 per hour #都是代表每小时10次
10/hour #都是代表每小时10次
10/hour;100/day;2000 per year #每小时10次,每天100次,每年2000次
100/day, 500/7days #每天100次,妹7天500次,注意days复数

上面per和/都是作为分隔符作用,接下来我们来看看具体使用,我们还是在正式的项目中使用,有应用工厂,还是在应用工厂中进行延迟初始化
我的扩展实例化都是在应用工厂的统计目录的__init__.py文件中

from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

limiter = Limiter(key_func=get_remote_address, storage_uri="memory://", default_limits=["200 per day", "50 per hour"])

我们限制策略是根据访问的IP地址,设置了一条全局的限制策略,是200次每天和50次每小时,然后存储方式是使用的内存方式,也可以使用redis,根据自己的需要进行选择,如果是redis的话storage_uri按照以下配置修改

storage_uri="redis://localhost:6379/0"

然后在应用工厂(application.py)中进行延迟初始化并挂载到app实例中


from apps import limiter
#工厂函数
def create_app():
    app = Flask(__name__)
    app.secret_key = 'yang.su'
    app.config.from_pyfile("../settings.py")
    limiter.init_app(app)
    return app

然后使用可以在直接视图函数中添加限制即可,error_message是自定策略消息

@action.route('/login', methods=['GET', 'POST'])
@limiter.limit("2/second", error_message="Too many requests!")
def login():
    pass

也可以装饰请求钩子上,这样整个请求的蓝本都会集成这个策略

@article.before_request
@limiter.limit("3/second", error_message="Too many requests!")
def post_cache():
    pass

当钩子或者具体的视图函数都设置了策略,两个策略是叠加的,也可以选择覆盖的全局的策略,使用override_defaults

@action.route('/login', methods=['GET', 'POST'])
@limiter.limit("2/second", override_defaults=True, error_message="Too many requests!")
def login():
    pass

还可以对指定的method方法进行限流,例如限流应用于POST方法,忽略其他方法

@action.route('/login', methods=['GET', 'POST'])
@limiter.limit("2/second", methods=["POST"], error_message="Too many requests!")
def login():
    pass

也可以对某些条件进行限流的豁免

@action.route('/login', methods=['GET', 'POST'])
@limiter.limit("2/second", exempt_when=lambda: current_user.level == 1, error_message="Too many requests!")
def login():
    pass

以上就是Flask-Limiter的使用介绍,可以根据需求动态调整限流规则、豁免特定条件下的限流、并且为不同的 HTTP 方法设定独立的限流规则。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.sulao.cn/post/1011

相关推荐