Flask - 当内容类型为"application/x-www-form-urlencoded"时,如何在POST请求中读取原始主体

Ron*_*ter 9 python ajax post flask

事实证明,request.data如果请求的内容类型是Flask,则Flask设置为空字符串application/x-www-form-urlencoded.由于我正在使用JSON正文请求,我只想解析json或强制Flask解析它并返回request.json.

这是必需的,因为更改AJAX内容类型会强制HTTP OPTION请求,这会使后端变得复杂.

如何让Flask返回请求对象中的原始数据?

iMo*_*om0 8

request.form.keys()[0]如果内容类型是,您可以获取发布数据application/x-www-form-urlencoded.

request.form是一个multidict,其键包含解析后的数据.

  • 似乎这也是获取帖子数据的方法。只需将 request.form.keys()[0] 更改为 `list(request.forms.keys())[0]`。感谢您终于解决了数小时的调试问题! (2认同)

Mar*_*ark 8

使用request.get_data()得到POST数据.这工作无关的数据是否包含内容类型application/x-www-form-urlencodedapplication/octet-stream.

  • 事实似乎并非如此。根据我收到的请求,如果我使用“get_data()”,我会得到一个空的“bytes()”,但是使用接受的答案的方法(查看表单键),我会得到一堆数据。 (2认同)
  • 是的,我也是, get_data() 中什么也没有,但按照接受的答案来做这件事似乎很荒谬。 (2认同)

raf*_*bbr 5

如果您想在请求为 'Content-Type': 'application/x-www-form-urlencoded' 时获取 JSON,您需要“强制”转换为 json,如下所示:

from flask import Flask, request
import os


app = Flask(__name__)


@app.route("/my-endpoint", methods = ['POST'])
def myEndpoint():

    requestJson = request.get_json(force=True)

    //TODO: do something....

    return requestJson


if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True, use_reloader=True)
Run Code Online (Sandbox Code Playgroud)