You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-Limiter初始化报错:TypeError: key_func参数值重复

解决Flask-Limiter初始化时的TypeError(key_func参数多值问题)

错误原因

你碰到的TypeError: Limiter.__init__() got multiple values for argument 'key_func'是参数传递方式错误导致的:
从报错代码片段看,你直接把限流规则"5/second"作为位置参数传给了Limiter构造函数,但Flask-Limiter的Limiter.__init__方法中,第二个位置参数是key_func,不是限流规则。当你同时传了这个位置参数和显式的key_func=...关键字参数时,就会造成key_func被重复赋值,触发错误。

另外你代码里还有两个隐性问题:

  • key_func=lambda: get_remote_address 返回的是函数对象,不是实际的客户端IP,应该直接传get_remote_address(它本身就是可调用的,会自动在请求上下文执行),或者调用它:lambda: get_remote_address()
  • 蓝图限流的key_func里,同样需要调用get_remote_address(),不能只返回函数本身

修正后的代码

from flask import Flask, request
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
import api

app = Flask(__name__, instance_relative_config=True)

# 正确初始化:用关键字参数传default_limits,key_func直接绑定get_remote_address
limiter = Limiter(
    app,
    default_limits=["5/second"],
    key_func=get_remote_address
)

# 修正蓝图限流的key_func逻辑:调用get_remote_address()获取IP
limiter.limit(
    "5/second",
    key_func=lambda: request.args.get('token') if 'token' in request.args else get_remote_address()
)(api.bp)

app.register_blueprint(api.bp)

环境差异说明

Apache环境下能运行,大概率是当时使用的Flask-Limiter版本较低,参数签名宽松,允许隐式的参数传递;切换到Nginx+gunicorn+gevent环境时,可能升级了Flask-Limiter版本,新版本的参数校验更严格,才把之前的隐性错误暴露出来。

内容的提问来源于stack exchange,提问作者Justin Battaglia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:11:32