python-3.x 为什么Flask bool查询参数的计算结果总是为true?

jpfvwuh4  于 2023-04-13  发布在  Python
关注(0)|答案(4)|浏览(122)

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

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

似乎任何输入都被认为是真的。有没有什么方法可以让这与Flask定义类型的方式一起工作,或者我需要接受一个字符串并比较它?

gtlvzcf8

gtlvzcf81#

request.args.gettype参数不是指定值的类型,而是指定一个callable

*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规则认为是true的任何值):

full_info = request.args.get('fullInfo', default=False, type=lambda v: v.lower() == '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}
ztmd8pv5

ztmd8pv52#

一个“技巧”是将json.loads用作type。它将充当一个“工厂”,将从字符串'true'/'false'构建bool True/False

3phpmpom

3phpmpom3#

这是预期的,因为查询字符串是一个实际的字符串,因此当你得到一个字符串时,无论它是什么,如果它不为空,它将为true。如:

>>>bool('False')
True

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

w80xi6nr

w80xi6nr4#

如果你使用flask_restplus.inputs.boolean类型而不是bool,它将正常工作。这里有解释。https://github.com/noirbizarre/flask-restplus/issues/199#issuecomment-276645303

相关问题