这是烧瓶代码:
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def refresh():
params = {
'thing1': request.values.get('thing1'),
'thing2': request.values.get('thing2')
}
return json.dumps(params)
这是cURL
:
$ curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
> {"thing1": "1", "thing2": null}
$ curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
> {"thing1": "1", "thing2": null}
docs似乎非常清楚这应该有效:
形式
一个MultiDict,包含来自POST或PUT请求的已解析表单数据。 请记住,文件上传不会在这里结束,但是 而是在files属性中。
ARGS
具有查询字符串的已解析内容的MultiDict。 (该 部分在问号后的URL中。
值
CombinedMultiDict,包含form和args的内容。
任何想法我做错了什么?
更新:尝试从其中一个答案中提出建议,换出return
行:
使用return json.dumps(json.load(request.body.decode("utf-8") ))
生成错误AttributeError: 'Request' object has no attribute 'body'
使用return json.dumps(json.load(request.json))
生成错误AttributeError: 'NoneType' object has no attribute 'read'
将POST
与原始代码一起使用似乎无效:
$ curl -XPOST 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
{"thing1": "1", "thing2": null}
设置内容类型并将POST
与原始代码一起使用也没有明显效果:
$ curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
{"thing1": "1", "thing2": null}
虽然我去验证了内容类型已正确设置:
...
print(request.headers)
...
Host: 127.0.0.1:5000
User-Agent: curl/7.54.0
Accept: */*
Content-Type: application/json
Content-Length: 12
答案 0 :(得分:4)
您无意中发送了错误的Content Type。
默认情况下,curl
's -d
flag will send POST data with content-type application/x-www-form-urlencoded
。由于您没有以其期望的格式( key = value )发送数据,因此它会完全丢弃数据。对于JSON数据,您需要将内容类型设置为application/json
的HTTP请求发送到curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
,如下所示:
request.form
此外,flask from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def refresh():
params = {
'thing1': request.values.get('thing1'),
'thing2': request.get_json().get('thing2')
}
return json.dumps(params)
app.run()
字段仅包含POST form data,而不包含其他内容类型。您可以使用request.data
访问原始POST请求正文,或者更方便的是使用request.get_json
访问已解析的JSON数据。
以下是您示例的固定版本:
request.body
更新:我之前错过了 - request.data
实际应该是request.get_json
。另外,现在应该使用request.json
is deprecated和{{1}}。原帖已更新。