我正在尝试将嵌套字典作为参数传递给GET请求,该请求由Flask工作人员处理。整个设置是Nginx + Gunicorn + Flask。在客户端,我正在做以下事情:
import requests
def find_cabin():
party = {'People' : [{'Age': 44, 'Gender': 'F', 'Habits': 'Smoking,Drinking'}, {'Age': 9, 'Gender': 'F'}
, {'Age': 4, 'Gender': 'F'}, {'Age': 49, 'Gender': 'M'}],
'Vehicles': [{'Make/Model': 'Honda Civic'}, {'Make/Model': 'Toyota RAV4'}],
'Must Haves':['Deck', 'Fireplace', 'Boat launch', {'Bedrooms': 2}]}
uri = 'mysite.com/find_cabin'
headers = {'Content-Type': 'application/json', 'Accept': 'text/plain'}
res = requests.get(uri, data=json.dumps(party), headers=headers)
return res.text
在服务器上,在我的Flask处理程序中,我这样做:
@app.route('/find_cabin/', methods=['GET'])
def find_cabin():
payload = request.data
# payload is empty
print ('payload for find_cabin: ', payload)
#process request
有效负载为空。我错过了什么?我应该如何将复杂的嵌套结构传递给我的Flask应用程序?
答案 0 :(得分:2)
GET方法没有正文。将数据编码为查询参数,或使用POST请求。如果使用POST,则可以直接将数据作为JSON传递:
requests.post(url, json=party)
# within the view
party = request.get_json()
如果您想使用GET,您只需将JSON编码为查询参数。
requests.get(url, params={'party': json.dumps(party)})
# within the view
party = json.loads(request.args['party'])
您还可以尝试提出一些方案将嵌套结构展平为查询参数,但这并不简单。简单的嵌套可以使用'。'分隔路径,列表可以多次指定密钥,但是如果有嵌套对象的嵌套列表怎么办?
这不是查询参数的真正好用,在这种情况下发送POST正文会更有意义。