为什么我的 Flask 请求对象总是空的?

eri*_*rip 4 post flask python-requests

我正在创建一个愚蠢的端点,它只记录发布的数据。

@app.route("/add_foo", methods=['POST'])
def add_foo():
    logger.debug(request.data)
    print(request.args.get('foo'))
    return "Success"
Run Code Online (Sandbox Code Playgroud)

然后我尝试将数据发布到此端点:

>>> import requests
>>> r = requests.post("http://127.0.0.1:8080/add_foo", data={'foo': 'foobar'})
Run Code Online (Sandbox Code Playgroud)

我看到以下输出:

 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
2016-07-28 08:59:22,432 - __main__ - DEBUG - b''
None
127.0.0.1 - - [28/Jul/2016 08:59:22] "POST /add_foo HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我通过 curl 发布数据时,我看到了同样的事情。这是我的 curl 命令:

curl -XPOST -d "{'foo': 'foobar'}" "http://localhost:8080/add_foo"
Run Code Online (Sandbox Code Playgroud)

发布的数据有什么问题?

Mar*_*ers 5

request.args访问URL 查询参数,即 URL 中的参数,在?. 您正在将值 POST 到请求正文中,因此请request.form改用。

从Flask 快速入门中的请求对象部分

要访问表单数据(在 POST 或 PUT 请求中传输的数据),您可以使用该form属性。

[...]

要访问在 URL ( ?key=value) 中提交的参数,您可以使用args属性 [.]

你也可以使用request.valuesobject,它结合了来自request.argsrequest.form对象的数据;args之前搜索过form

  • @erip:为了效率起见,表单数据解析不会保留请求正文,因为它确实可能非常大(想想文件上传)。 (2认同)