flask-limiter 是一个对客户端的访问速率进行限制的flask扩展.可以自定义一些访问的(速度)限制条件来把那些触发限制的请求拒之门外.一般常用来进行对爬虫的限制.
下面就常见的用法,举了一些例子.更多的例子,请自己查看原始文档.

from flask import Flask, request, render_template
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address 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=app, key_func=get_remote_address, default_limits=["100/day, 2/minute, 1/second"]) @limiter.request_filter
def filter_func():
"""
定义一个限制器的过滤器函数,如果此函数返回True,
则不会施加任何限制.一般用这个函数创建访问速度
限制的白名单,可以使用某些celeb集中处理需要
limiter.exempt的情况
"""
path_url = request.path
white_list = ['/exempt']
if path_url in white_list:
return True
else:
return False @app.route('/')
@limiter.exempt # 取消默认限制器
def hello_world():
return render_template("login.html") @app.route("/exempt")
def exempt_func():
"""此视图函数被过滤器忽略"""
return "no limited" @app.route('/h1', methods=['post', 'get'])
# 自定义限制器覆盖了默认限制器
@limiter.limit("100/day;10/hour;3/minute")
def h1_func():
return "h1" def get_key():
"""自定义的key_fun函数"""
return request.host_url @app.route('/h2', methods=['post', 'get'])
# 自定义限制器覆盖了默认限制器,同时自定义了key_func函数
@limiter.limit(limit_value="100/day;10/hour;3/minute", key_func=get_key)
def h2_func():
return "h2" @app.route('/h3', methods=['post', 'get'])
# 自定义限制器覆盖了默认限制器,参数说明如下:
# 1. param limit_value: 访问限制阈值
# 1. param exempt_when: 例外条件 (限制器只对使用不带debug访问的请求生效)
# 2. param error_message: 错误的返回信息(注意,暂不支持中文,如果使用中文,请自定义错误页)
# 3. param methods: 对哪些方法启用限制器?
@limiter.limit(limit_value="1/minute",
exempt_when=lambda: request.args.get("debug") is not None or request.form.get("debug") is not None,
error_message="request be rejected",
methods=['get'])
def h3_func():
return "h3" """共享限制次数的限制器"""
shared_limiter = limiter.shared_limit(limit_value="7/minute", scope="aaa") @app.route("/s1")
# 和s2_func视图共享shared_limiter的限制阈值
@shared_limiter
def s1_func():
return "s1" @app.route("/s2")
# 和s1_func视图共享shared_limiter的限制阈值
@shared_limiter
def s2_func():
return "s2" if __name__ == '__main__':
app.run(host="0.0.0.0", port=5011, debug=True)
原始文档地址 http://flask-limiter.readthedocs.io/en/stable/

最新文章

  1. Java 序列化与反序列化
  2. jenkins+findbugs
  3. 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221
  4. svn 服务器的搭建 on Ubuntu
  5. 第一篇:APUE-操作系统IO模型
  6. Java基础知识强化24:Java中异常
  7. Centos7架设NMP服务器笔记
  8. [bzoj2594][Wc2006]水管局长数据加强版 (lct)
  9. HTML5文件操作API
  10. Leetcode_7_Reverse Integer
  11. Java程序生成一个Access文件
  12. 多系统引导 Grub
  13. php const常量 不能使用字符串连接符.链接
  14. python3 操作MYSQL实例及异常信息处理--用traceback模块
  15. mvn 修改所有子项目pom版本
  16. EF CodeFirst学习笔记004--足够聪明
  17. Jmeter(十五)_上传与下载
  18. ES按资源类型统计个数
  19. java中break,continue,标签实现goto效果(编程思想)
  20. Bluetooth® Low Energy Beacons

热门文章

  1. Reinforcement Learning for Self Organization and Power Control of Two-Tier Heterogeneous Networks
  2. [Linux] 028 源码包安装过程
  3. HTML5+Canvas手机拍摄,本地压缩上传图片
  4. python 分析 知乎粉丝数据
  5. Redis设计与实现 -- 链表与字典
  6. 66.Subarray Sum Equals K(子数组和为K的个数)
  7. mitdump爬取当当网APP图书目录
  8. 微软Visual Studio Code基本特征
  9. 只用ipv6 两台机器共享文件夹, 局域网连接路径,共享文件夹路径中ipv6地址如何表示
  10. 关于.net中使用reportview所需注意