【问题标题】:Why is my Flask request object always empty?为什么我的 Flask 请求对象总是空的?
【发布时间】:2016-12-02 21:32:58
【问题描述】:

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

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

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

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

我看到以下输出:

 * 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 -

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

curl -XPOST -d "{'foo': 'foobar'}" "http://localhost:8080/add_foo"

发布的数据有什么问题?

【问题讨论】:

    标签: post flask python-requests


    【解决方案1】:

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

    来自 Flask 快速入门中的 Request Object section

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

    [...]

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

    您还可以使用request.values object,它结合了来自request.argsrequest.form 对象的数据; argsform 之前搜索。

    【讨论】:

    • 有趣。 request.data 也只捕获这些查询参数?
    • @erip: request.data 是未解析的原始正文。 request.form 是解析成字典的数据,前提是您的请求具有正确的内容类型(application/x-www-form-urlencodedmultipart/form-data)。
    • 我可能希望原始正文不是空的,尤其是在未解析的情况下。我可以确认使用request.form 有效,但我仍然发现request.data 有点模糊。
    • @erip: 来自Werkzeug BaseRequest class documentation: 请注意,如果表单数据已被解析,此方法将不会返回任何内容,因为表单数据解析不会像此方法那样缓存数据。
    • @erip:为了提高效率,表单数据解析不会保留请求正文,因为它可能确实非常大(想想文件上传)。
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2021-12-04
    • 1970-01-01
    • 2016-02-24
    • 2019-04-12
    • 2017-04-07
    • 2015-09-04
    • 1970-01-01
    相关资源
    最近更新 更多