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/

flask扩展系列之 - 访问速度限制的更多相关文章

  1. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  2. Flask开发系列之快速入门

    Flask开发系列之快速入门 文档 一个最小的应用 调试模式 路由 变量规则 构造 URL HTTP 方法 静态文件 模板渲染 访问请求数据 环境局部变量 请求对象 文件上传 Cookies 重定向和 ...

  3. Flask 扩展 自定义扩展

    创建一个为视图访问加日志的扩展Flask-Logging,并从中了解到写Flask扩展的规范. 创建工程 先创建一个工程,目录结构如下: flask-logging/ ├ LICENSE # 授权说明 ...

  4. Flask开发系列之初体验

    Flask开发初探 介绍 在日常开发中,如果需要开发一个小型应用或者Web接口,一般我是极力推崇Flask的,主要是因为其简洁.扩展性高. 从这篇文章开始,我会写一个关于Flask的系列文章,通过多个 ...

  5. 2.6、Flask扩展

    Flask 被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发. 社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你 ...

  6. Flask开发系列之数据库操作

    Flask开发系列之数据库操作 Python数据库框架 我们可以在Flask中使用MySQL.Postgres.SQLite.Redis.MongoDB 或者 CouchDB. 还有一些数据库抽象层代 ...

  7. Flask开发系列之Web表单

    Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_template app = Flask(__name__) @app.ro ...

  8. Flask开发系列之模板

    Flask开发系列之模板 本文对<FlaskWeb开发:基于python的Web应用开发实战>模板一节做的总结. Jinja2模板引擎 模板 模板是一个包含响应文本的文件,其中包含用占位变 ...

  9. dapper-dot-net用法及其扩展系列

    dapper-dot-net用法及其扩展系列 虽然已经一段时间没写.net了,但是昨天看了下dapper和Dapper-Extensions在github仍然有更新,他们的受欢迎程度可想而知.所以想把 ...

随机推荐

  1. JavaScript.convertArray

    function convertArray(nodeList){     var arr = []     if(Array.prototype.slice){         arr = [].sl ...

  2. [洛谷P1552] [APIO2012]派遣(左偏树)

    这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...

  3. 702:Crossing River (贪心)

    [题目描述] N个人过河,一次过去2个回来一个,给出每个人所需时间,问最小过河时间. [题目链接] http://noi.openjudge.cn/ch0406/702/ [算法] 一开始想样例是怎么 ...

  4. C# WCF 服务引用与Web引用

    参考:https://blog.csdn.net/yelin042/article/details/82770205

  5. K3 cloud中消耗性生物资产已郁闭达到可销售状态,要从消耗性生物资产转至库存商品,要如何结转?

    处理方法: 先做出库单,然后做入库单,选择细目的时候出库单选择的是消耗性生物资产中的细目,如图所示: 然后入库的时候选择库存商品,如下图所示:

  6. Java 集合遍历

    在集合中使用Lambda表达式 Map集合中 forEach and Map 常规遍历-> 两种遍历: Map map = new HashMap(); map.put(102, "张 ...

  7. linux设置python虚拟环境的环境变量

    针对 linux系统中 python虚拟环境 设置环境变量 2种方法: 1.在建好的虚拟环境的 venv/bin/active 文件中,写入需要的环境变量,再进入虚拟环境: 如 配置文件路径 JERR ...

  8. 数据结构 java概况

    数据结构可以分为三种结构: 线性结构: 数组:栈:队列:链表:哈希表 树结构: 二叉树,二分搜索树,AVL,红黑树,Treap,Splay,堆,Trie,线段树,K-D树,并查集,哈夫曼树 图结构 邻 ...

  9. Codeforces Round #420 (Div. 2) - B

    题目链接:http://codeforces.com/contest/821/problem/B 题意:二维每个整点坐标(x,y)拥有的香蕉数量为x+y,现在给你一个直线方程的m和b参数,让你找一个位 ...

  10. Vue-系统修饰键

    可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器. .ctrl .alt .shift .meta 例如: 例如: <!-- Alt + C --> <input ...