为什么 Flask bool 查询参数总是评估为 true?

Cur*_*nir 20 python flask python-3.x

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

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

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

Gin*_*pin 42

type的参数不是request.args.get用于指定值的类型,而是用于指定可调用的

\n
\n
    \n
  • type \xe2\x80\x93 一个可调用对象,用于转换 MultiDict 中的。如果此可调用引发ValueError,则返回默认值。
  • \n
\n
\n

它接受一个可调用对象(例如函数),将该可调用对象应用于查询参数值,然后返回结果。所以代码

\n
request.args.get("fullInfo", default=False, type=bool)\n
Run Code Online (Sandbox Code Playgroud)\n

调用bool(value)其中value是查询参数值。在 Flask 中,查询参数值始终存储为字符串。调用非空字符串将始终bool()True

\n
In [10]: bool(\'true\')\nOut[10]: True\n\nIn [11]: bool(\'false\')\nOut[11]: True\n\nIn [12]: bool(\'any non-empty will be true\')\nOut[12]: True\n\nIn [13]: bool(\'\')\nOut[13]: False\n
Run Code Online (Sandbox Code Playgroud)\n

您可以传递一个函数来代替bool,该函数显式检查该字符串是否等于文字字符串true(或者您的 API 规则认为为 true 的任何值):

\n
def is_it_true(value):\n  return value.lower() == \'true\'\n\n@app.route("/test")\ndef test():\n  full_info = request.args.get(\'fullInfo\', default=False, type=is_it_true)\n  return jsonify({\'full_info\': full_info})\n
Run Code Online (Sandbox Code Playgroud)\n
$ curl -XGET http://localhost:5000/test?fullInfo=false\n{"full_info":false}\n\n$ curl -XGET http://localhost:5000/test?fullInfo=adasdasd\n{"full_info":false}\n\n$ curl -XGET http://localhost:5000/test?fullInfo=11431423\n{"full_info":false}\n\n$ curl -XGET http://localhost:5000/test?fullInfo=\n{"full_info":false}\n\n$ curl -XGET http://localhost:5000/test?fullInfo=true\n{"full_info":true}\n\n$ curl -XGET http://localhost:5000/test?fullInfo=TRUE\n{"full_info":true}\n\n$ curl -XGET http://localhost:5000/test\n{"full_info":false}\n
Run Code Online (Sandbox Code Playgroud)\n


Vit*_*lio 7

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