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
相关产品推荐
相关产品推荐

