Flask-Limiter 详细使用说明
本文首发于:行者AI
速率限制通常作为服务的防御措施予以实施。服务需要保护自身以免过度使用(无论是有意还是无意),从而保持服务可用性。在 Flask 项目开发过程中,遇到了需要对接口进行限制的需求,又不想去造轮子,这时候就需要用到 Flask-Limiter 这个三方库。本文将对 Flask-Limiter 的使用进行详细说明。
1. 安装
安装依赖环境。
2. 快速开始
有两种方式表示速率限制:
"100 per day"、"20 per hour"、"5 per minute"、"1 per second"
"100/day"、"20/hour"、"5/minute"、"1/second"
速率限制可以设置全局配置,针对所有接口进行限制;也可以通过装饰器进行局部限制;对于不想限制的接口,可以通过装饰器@limiter.exempt
进行解除限制。示例代码如下所示:
3. 装饰器
根据个人喜好和使用场景,有以下几种方式:单一修饰:限制字符串可以是单个限制,也可以是定界符分隔的字符串。
多个装饰器:限制字符串可以是单个限制,也可以是定界符分隔的字符串,也可以是两者的组合。
自定义功能:默认情况下,根据 Limiter 实例初始化时所使用的关键功能来应用速率限制。开发者可以实现自己的功能。
动态加载限制的字符串:在某些情况下,需要从代码外部的源(数据库,远程 api 等)中检索速率限制。这可以通过向装饰器提供可调用对象来实现。
注意:所装饰的路由上每个请求都会调用提供的可调用对象,对于昂贵的检索,请考虑缓存响应。
4. 限制域
指根据什么进行限制,对应的参数为key_func
,flask_limiter.util
提供了两种方式:
flask_limiter.util.get_ipaddr()
:使用X-Forwarded-For
标头中的最后一个 IP 地址,否则回退到请求的remote_address
。flask_limiter.util.get_remote_address()
:使用请求的remote_address
。
注意:在真实开发中,大部分项目都配置了 Nginx,如果直接使用 get_remote_address,获取到的是 Nginx 服务器的地址,相当于来自该 Nginx 服务器的所有请求会被当做同一个 IP 访问,所以项目中一般都是自定义 key_func!
获取 IP 的依据是根据 Nginx 的配置决定的:
5. 共享限制
适用于速率限制由多条路由共享的情况。
命名共享限制:通过相同的 shared_limit 对象进行装饰。
动态共享限制:将可调用对象作为范围传递,该函数的返回值将用作范围。注意,callable 具有一个参数:表示请求端点的字符串。
6. 储存后端
记录 IP 访问次数,用于判断该 IP 访问次数是否达到限制。Limiter 默认使用内存作为储存后端,但是在实际开发中,可能会涉及到多进程资源不共享、服务器内存消耗等问题,一般是使用 redis 作为储存后端。
需要 redis 服务器的位置,以及可选的数据库号。
redis://localhost:6379
或redis://localhost:6379/n
(对于数据库 n)。如果 redis 服务器正在通过 unix 域套接字监听,则可以使用
redis+unix:///path/to/sock
或redis+unix:///path/to/socket?db=n
(对于数据库 n)。如果数据库受密码保护,则可以在 URL 中提供密码,例如,
redis://:foobared@localhost:6379
或者redis+unix//:foobered/path/to/socket
。
7. 总结
通过对 API 请求的限制和配额,在一定程度上能避免系统收到超出其处理能力的数据,确保系统的资源能得到合理的使用。以上就是本文的全部内容,希望能给大家学习带来帮助。
版权声明: 本文为 InfoQ 作者【行者AI】的原创文章。
原文链接:【http://xie.infoq.cn/article/b68113c1a402a135be298692e】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论