Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting Flask form data to JSON only gets first value

I want to take input from an HTML form and give the output in JSON format. When multiple values are selected they are not converted into JSON arrays, only the first value is used.

@app.route('/form')
def show_form():
    return render_template('form.html')

@app.route("/result", methods=['POST'])
def show_result():
    result = request.form
    return render_template('result.html', result=result)

form.html:

<form method=POST>
   <input name=server>
   <select name=owners multiple>
       <option value="thor">thor</option>
       <option value="loki">loki</option>
       <option value="flash">flash</option>
       <option value="batman">batman</option>
   </select>
   <input type=submit>
</form>

result.html:

{{ result|tojson }}

When multiple values for owner are selected, "thor" and "flash", the output shows only one value:

{"server": "app-srv", "owners": "thor"}

I expect owners to be a list:

{"server": "app-srv", "owners": ["thor", "flash"]}

How do I display the form as JSON without losing list values?

like image 985
Aditya Pednekar Avatar asked Aug 09 '17 12:08

Aditya Pednekar


People also ask

How do you process incoming request data in Flask?

To access the incoming data in Flask, you have to use the request object. The request object holds all incoming data from the request, which includes the mimetype, referrer, IP address, raw data, HTTP method, and headers, among other things.

How do you get a Flask post body?

If you post JSON with content type application/json , use request. get_json() to get it in Flask. If the content type is not correct, None is returned. If the data is not JSON, an error is raised.


1 Answers

request.form is a MultiDict. Iterating over a multidict only returns the first value for each key. To get a dictionary with lists of values, use to_dict(flat=False).

result = request.form.to_dict(flat=False)

All values will be lists, even if there's only one item, for consistency. If you want to flatten single-value items, you need to process the data manually. Use iterlists with a dict comprehension.

result = {
    key: value[0] if len(value) == 1 else value
    for key, value in request.form.iterlists()
}
like image 102
davidism Avatar answered Oct 03 '22 12:10

davidism