在Flask中将POST对象转换为适合mongodb的表示形式

Iva*_*n P 38 python post mongodb pymongo flask

我正在使用Flask和MongoDB.我试图将request.form的内容转换为适合通过PyMongo保存的内容.似乎应该经常出现一些现成的解决方案.

那么Flask给我的是:

ImmutableMultiDict([('default', u''), ('required': u'on'), ('name', u'short_text'), ('name', u'another'), ('submit', u'Submit')])
Run Code Online (Sandbox Code Playgroud)

而我希望得到的是接近这一点:

{
  'default': '',
  'name': ['short_text', 'another'],
  'required': true
}
Run Code Online (Sandbox Code Playgroud)

Vb4*_*407 48

>>> 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']}
Run Code Online (Sandbox Code Playgroud)

.to_dict(flat=False)是要记住的事情.请参阅相关文档

  • 只需使用像`imd.to_dict()`这样的`.to_dict()`方法.这样每个值都不是列表,就像在您的解决方案中一样.您也不需要导入ImmutableMultiDict (6认同)
  • `imd.to_dict(flat=False) ` 正是 OP 正在寻找的。请参阅上面编辑后的答案。 (2认同)

Joe*_*cci 18

Flask ImmutableMultiDict数据结构具有内置to_dict方法.

除了Flask request对象form属性之外,这些知识ImmutableMultiDict允许简单地处理对MongoDB的表单POST请求.

请参阅下面的一个天真的例子:

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)
Run Code Online (Sandbox Code Playgroud)


lov*_*esh 17

您可以使用werkzeug的getlist来编写这样的代码

data = dict((key, request.form.getlist(key)) for key in request.form.keys())
Run Code Online (Sandbox Code Playgroud)

现在每个键data都是一个包含1个元素的列表.要以您的格式准确获得结果,请执行此操作

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())
Run Code Online (Sandbox Code Playgroud)

现在这是低效的,因为每个键有3个调用request.form.getlist(key).你可以写一个循环并绕过它.


Mel*_*kor 13

request.form.to_dict() 会产生你需要的东西