我的理解是,
request.args
Flask 中包含来自
GET
请求的 URL 编码参数,而
request.form
包含
POST
数据。我很难理解为什么在发送
POST
请求时,尝试使用
request.form
访问数据会返回
400
错误,但是当我尝试使用
request.args
访问它时,它似乎工作正常.
我尝试使用
Postman
和
curl
发送请求,结果是相同的。
curl -X POST -d {"name":"Joe"} http://127.0.0.1:8080/testpoint --header "Content-Type:application/json"
代码:
@app.route('/testpoint', methods = ['POST'])
def testpoint():
name = request.args.get('name', '')
return jsonify(name = name)
对于
request.args
和
request.form
的理解是正确的,但遇到问题的原因在于正在发送 JSON 数据,而不是表单数据。
-
request.args:
用于从 URL 查询字符串中获取数据,例如
http://example.com/?name=John
。 -
request.form:
用于从编码为表单数据的 POST 请求中获取数据,例如
name=John&age=30
。
当发送 JSON 数据时,Flask 将其视为请求正文,而不是表单数据。 因此,
request.form
将为空。
要访问 JSON 数据,需要使用
request.get_json()
方法:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/testpoint', methods = ['POST'])
def testpoint():
data = request.get_json()
name = data.get('name', '')
return jsonify(name=name)
if __name__ == '__main__':
app.run(debug=True, port=8080)
解释:
-
request.get_json()
: 此方法解析请求正文中的 JSON 数据,并将其作为 Python 字典返回。 -
data.get('name', '')
: 从解析的 JSON 数据中获取name
键的值。 如果name
键不存在,则返回空字符串。
使用 curl 发送 JSON 数据:
curl -X POST -H "Content-Type: application/json" \
-d '{"name":"Joe"}' \
http://127.0.0.1:8080/testpoint
注意:
确保在发送 JSON 数据时,设置
Content-Type
标头为
application/json
,以便 Flask 正确解析数据。