在Flask

时间:2018-01-16 02:16:38

标签: python curl 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.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

1 个答案:

答案 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}}。原帖已更新。