flask接口请求频率限制

pip install Flask-Limiter

Flask-Limiter官方文档

基本使用

默认是用IP作为key进行计数的,你也可以自定义key

python 复制代码
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

app = Flask(__name__)

limiter = Limiter(
    get_remote_address,
    app=app,
    default_limits=["200 per day", "50 per hour"],
    storage_uri=f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DATABASE}'
)

# 或者先在一个global的地方初始化:
limiter = Limiter(get_remote_address, storage_uri=REDIS_URL)
# 然后在 create_app 的地方 init_app
limiter.init_app(flask_app)

# 视图函数里面加装饰器
@limiter.limit("20/day;5/minute")
def post(self):

自定义Key Functions

自带的get_remote_address不好用,无法获取真实用户的IP,需要自己写一个Key Functions

python 复制代码
from flask import request

# request.headers.X-Forwarded-For: 真.实.I.P, 192.168.2.2, 第二台代理机器的IP, ..., 最后一台代理机器的IP
def get_real_ip():
    if x_forwarded_for := request.headers.get("X-Forwarded-For"):
        if ips := list(filter(lambda x: x, [ip.strip() for ip in x_forwarded_for.split(',')])):
            return ips[0]

    if x_real_ip := request.headers.get("X-Real-Ip"):
        return x_real_ip.strip()

    if remote_addr := request.remote_addr:
        return remote_addr.strip()

    return 'ipunknown'

# 全局 Key Functions
limiter = Limiter(get_real_ip, storage_uri=REDIS_URL)

# 局部 Key Functions
@limiter.limit("1 per day", key_func = lambda : current_user.username)
def post(self):

自定义错误处理

python 复制代码
def too_many_request(request_limit):
    return jsonify({'code': 403, 'msg': '请稍后再试!'})

# 全局错误处理
limiter = Limiter(get_remote_address, storage_uri=REDIS_URL, on_breach=too_many_request)

# 单独错误处理
@limiter.limit("20/day;5/minute", on_breach=too_many_request)
def post(self):

自定义计数逻辑

比如 有时候,希望登录失败的,才进行计数,登录失败超过20次就禁止访问,而登录成功的,不计数,随便请求 无限制

python 复制代码
@limiter.limit("20/day;5/minute", deduct_when=lambda response: response.json.get('code') ==400)
def post(self):

# 上面的例子是:返回的JSON中code==400 就做一次计数,否则就不计数(这次请求,不计入限制)
# 还可以有其他的计数逻辑,比如
deduct_when=lambda response: response.status_code != 200

更多操作见官网

相关推荐
好奇的菜鸟3 分钟前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.012 分钟前
Go语言进阶&依赖管理
开发语言·后端·golang
许苑向上17 分钟前
Dubbo集成SpringBoot实现远程服务调用
spring boot·后端·dubbo
郑祎亦1 小时前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
nuclear20111 小时前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
本当迷ya1 小时前
💖2025年不会Stream流被同事排挤了┭┮﹏┭┮(强烈建议实操)
后端·程序员
Lucky小小吴1 小时前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
GIS 数据栈2 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
爱分享的码瑞哥2 小时前
Python爬虫中的IP封禁问题及其解决方案
爬虫·python·tcp/ip
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea