【问题标题】:How to pass a nested dictionary to Flask's GET request handler如何将嵌套字典传递给 Flask 的 GET 请求处理程序
【发布时间】:2015-03-13 15:18:20
【问题描述】:

我正在尝试将嵌套字典作为参数传递给 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 应用程序?

【问题讨论】:

    标签: python flask python-requests


    【解决方案1】:

    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 正文会更有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多