【问题标题】:Consistent way to get request payload in Flask在 Flask 中获取请求有效负载的一致方法
【发布时间】:2018-01-16 20:17:37
【问题描述】:

我有一个接受一些 POST 数据的 Flask 视图。我可以使用 curl 将数据作为表单编码或 JSON 发布。无论客户以哪种方式发布数据,我如何获取数据?

from flask import request

@app.route('/', methods=['GET', 'POST'])
def refresh():
    # empty when posted as JSON
    print(request.form)
    # empty when posted as form-encoded
    print(request.data)
    return 'Hello, World!'
curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
curl -XPOST 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'

【问题讨论】:

  • 您阅读过 API 文档吗? flask.pocoo.org/docs/0.12/api/#flask.Request
  • 是的。我肯定读过文档。费解后,观察到的行为与文档中描述的一致。文档没有描述访问请求负载的始终有效的方法。

标签: python curl flask


【解决方案1】:

Flask 没有提供属性来在一个地方获取解析的数据。您应该知道您的视图接受哪些数据并执行所需的操作。如果客户希望他们的请求成功,他们应该只传递视图接受的数据。

Flask-WTF provides a form class that picks from form, files, and get_json depending on what has data.你可以做类似的事情。

from werkzeug.datastructures import CombinedMultiDict, ImmutableMultiDict

def form_or_json():
    if request.method == 'POST':
        if request.files:
            return CombinedMultiDict((request.files, request.form))
        elif request.form:
            return request.form
        elif request.get_json():
            return ImmutableMultiDict(request.get_json())

# in a view
data = form_or_json()

如果您想获取原始数据,无需 Flask 处理,请使用request.get_data()。这通常不是必需的,您应该让 Flask 处理表单或 JSON 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多