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

2024-05-29 05:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用烧瓶和MongoDB。我正在尝试将request.form的内容转换为适合通过PyMongo保存的内容。它似乎应该经常出现,足以有现成的解决方案。

烧瓶给我的东西是:

ImmutableMultiDict([('default', u''), ('required': u'on'), ('name', u'short_text'), ('name', u'another'), ('submit', u'Submit')])

我想得到的是接近这个的东西:

{
  'default': '',
  'name': ['short_text', 'another'],
  'required': true
}

Tags: textnameformdefault内容烧瓶onrequest
3条回答
>>> 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)是要记住的事情。参见相关的documentation

FlaskImmutableMultiDict数据结构具有内置的to_dict方法。

除了Flaskrequest对象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)

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

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

现在data的每个键都是一个列表,其中还包含一个元素。要获得与您的格式完全相同的结果,请执行以下操作

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())

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

相关问题 更多 >

    热门问题