【发布时间】:2018-06-24 16:29:13
【问题描述】:
这是烧瓶代码:
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 似乎非常清楚这应该可以工作:
表格
带有来自 POST 或 PUT 请求的已解析表单数据的 MultiDict。 请记住,文件上传不会在这里结束,但 而是在 files 属性中。
参数
具有查询字符串的解析内容的 MultiDict。 (这 在问号后面的 URL 部分)。
价值观
一个包含 form 和 args 内容的 CombinedMultiDict。
任何想法我做错了什么?
更新:尝试来自答案之一的建议,换掉 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
【问题讨论】:
-
curl -X GET发送一个 GET 请求...你需要curl -X POST -
谢谢,但没有帮助。我明确想在请求正文中发送带有 JSON 的 GET。
-
你试过
request.get_json()而不是request.values,因为如果你设置Content-Type: application/jsonheader,它就可以工作。 -
request.json提供解析的字典,而不是字符串,这就是json.load失败的原因。我还错误地指出 POST 原始文本正文存储在request.body中,而它实际上存储在request.data中。原始答案已更新以更正此问题。 -
啊。我怀疑这也会导致问题,但由于错误是“NoneType..”,问题似乎不是
json.load正在尝试加载字典,而是它正在尝试加载None。不管怎样,我的问题已经解决了。