为什么 Flask 的 bool 查询参数始终评估为 true?

19

我在Flask应用程序的一个端点中有一个奇怪的行为,它接受布尔查询参数。无论我传递什么,例如asfsdfdtruefalse,它都被认为是真的。只有当它为空时,它才变成假。

full_info = request.args.get("fullInfo", default=False, type=bool)
if full_info:
    # do stuff

似乎任何输入都被视为true。有没有办法按照Flask预期的方式定义类型来使其正常工作,还是我需要接受一个字符串并进行比较?

看起来任何输入都被认为是true。是否有办法按照Flask的意图定义类型以使其正常工作?或者我需要接受一个字符串并进行比较吗?

4个回答

42
request.args.gettype参数并不是用于指定值的类型,而是用于指定一个可调用对象
  • type - 一个可调用对象,用于将MultiDict中的值进行类型转换。如果该可调用对象引发了ValueError,则返回默认值。
它接受一个可调用对象(例如函数),将该可调用对象应用于查询参数的值,并返回结果。因此,代码示例:
request.args.get("fullInfo", default=False, type=bool)

调用`bool(value)`,其中`value`是查询参数的值。在Flask中,查询参数的值始终以字符串形式存储。而且,在非空字符串上调用`bool()`将始终返回`True`。
In [10]: bool('true')
Out[10]: True

In [11]: bool('false')
Out[11]: True

In [12]: bool('any non-empty will be true')
Out[12]: True

In [13]: bool('')
Out[13]: False

不必使用bool,您可以传递一个函数,该函数明确检查字符串是否等于字面字符串true(或者根据您的API规则,可以被视为真值的任何值):
def is_it_true(value):
  return value.lower() == 'true'

@app.route("/test")
def test():
  full_info = request.args.get('fullInfo', default=False, type=is_it_true)
  return jsonify({'full_info': full_info})

$ curl -XGET http://localhost:5000/test?fullInfo=false
{"full_info":false}

$ curl -XGET http://localhost:5000/test?fullInfo=adasdasd
{"full_info":false}

$ curl -XGET http://localhost:5000/test?fullInfo=11431423
{"full_info":false}

$ curl -XGET http://localhost:5000/test?fullInfo=
{"full_info":false}

$ curl -XGET http://localhost:5000/test?fullInfo=true
{"full_info":true}

$ curl -XGET http://localhost:5000/test?fullInfo=TRUE
{"full_info":true}

$ curl -XGET http://localhost:5000/test
{"full_info":false}

7
一个"技巧"是使用json.loads作为type。它将充当一个"工厂",用于从字符串 'true'/'false' 创建布尔值 True/False

如果传递的参数是'True'/'False'(尽管这本身可能是前端使用大写T/F的错误),则此方法无法正常工作。 - Gino Mempin
1
如果你需要处理更多基本的边缘情况,比如"true" -> True, "false" -> False, 那么你只需要编写一个函数,使用自定义逻辑将查询参数作为字符串("true", "false", "True", "yes", "no", "0", "1", "one"等)转换为布尔值True / False。 - Vito De Tullio

3

预期的结果是查询字符串是实际的字符串,所以当您获得一个字符串时,无论它是什么,只要它不为空,它就为真。 例如:

>>>bool('False')
True

如果你想得到一个布尔值,就必须进行字符串比较。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接