In Flask convert form POST object into a representation suitable for mongodb In Flask convert form POST object into a representation suitable for mongodb python python

In Flask convert form POST object into a representation suitable for mongodb


>>> from werkzeug.datastructures import ImmutableMultiDict>>> imd = ImmutableMultiDict([('default', u''), ('required', u'on'), ('name', u'short_text'), ('name', u'another'), ('submit', u'Submit')])>>> imd.to_dict(flat=False)>>> {'default': [''], 'name': ['short_text', 'another'],'required': ['on'],'submit': ['Submit']}

.to_dict(flat=False) is the thing to keep in mind. See the relevant documentation


The Flask ImmutableMultiDict data structure has a built in to_dict method.

This knowledge in addition to the Flask request object form property being an ImmutableMultiDict allows for simple handling of a form POST request to MongoDB.

See below for a naive example:

from flask import request@app.route('/api/v1/account', methods=['POST'])def create_account():    """Create user account"""    account_dict = request.form.to_dict()    db.account.insert_one(account_dict)


You can use werkzeug's getlist to write code like this

data = dict((key, request.form.getlist(key)) for key in request.form.keys())

Now each key of data would be a list which would contain 1 more element. To get results exactly in your format do this

data = dict((key, request.form.getlist(key) if len(request.form.getlist(key)) > 1 else request.form.getlist(key)[0]) for key in request.form.keys())

Now this is inefficient because for each key there are 3 calls to request.form.getlist(key). You can write a loop and get around it.