我在Flask应用程序中的一个端点有一个奇怪的行为,它接受布尔查询参数。无论我传递给它什么,例如asfsdfd
或true
或false
,它都被认为是true。只有将其留空,它才会变成false。
full_info = request.args.get("fullInfo", default=False, type=bool)
if full_info:
# do stuff
似乎任何输入都被认为是真的。有没有什么方法可以让这与Flask定义类型的方式一起工作,或者我需要接受一个字符串并比较它?
4条答案
按热度按时间gtlvzcf81#
request.args.get
的type
参数不是指定值的类型,而是指定一个callable:*type-用于转换MultiDict中的值的可调用对象。如果此可调用对象引发ValueError,则返回默认值。
它接受一个可调用对象(例如函数),将该可调用对象应用于查询参数值,并返回结果。
调用
bool(value)
,其中value
是查询参数值。在Flask中,查询参数值始终存储为字符串。并且在非空字符串上调用bool()
将始终是True
:除了
bool
,你可以传递一个函数来显式检查字符串是否等于文字字符串true
(或者你的API规则认为是true的任何值):ztmd8pv52#
一个“技巧”是将
json.loads
用作type
。它将充当一个“工厂”,将从字符串'true'
/'false'
构建boolTrue
/False
。3phpmpom3#
这是预期的,因为查询字符串是一个实际的字符串,因此当你得到一个字符串时,无论它是什么,如果它不为空,它将为true。如:
如果你想得到一个布尔值,你必须进行字符串比较。
w80xi6nr4#
如果你使用flask_restplus.inputs.boolean类型而不是bool,它将正常工作。这里有解释。https://github.com/noirbizarre/flask-restplus/issues/199#issuecomment-276645303