web-dev-qa-db-ja.com

In Flask= formをPOSTオブジェクトをmongodbに適した表現に変換する

私はFlaskとMongoDBを使用しています。request.formのコンテンツをPyMongo経由で保存するのに適したものに変換しようとしています。ソリューションを作りました。

だから、Flask私にくれたものは次のようなものです:

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

そして、私が手に入れたいのはこれに近いものです:

{
  'default': '',
  'name': ['short_text', 'another'],
  'required': true
}
35
Ivan P
_>>> 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)は覚えておくべきものです。関連する ドキュメント を参照してください

45
Vb407

Flask ImmutableMultiDictデータ構造にはto_dict 方法。

Flask request object formプロパティがImmutableMultiDictであることに加えて、この知識により、フォーム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)
18
Joel Colucci

Werkzeugの getlist を使用して、次のようなコードを記述できます。

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

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

キーごとにrequest.form.getlist(key)の呼び出しが3回あるため、これは非効率的です。ループを作成して回避することができます。

17
lovesh

request.form.to_dict()は必要なものを生成します

13
Mellkor

pythonバージョン3.6。の前後のdict()メソッドと.to_dict()メソッドの比較。

_from werkzeug.datastructures import ImmutableMultiDict
imd = ImmutableMultiDict([('default', u''), ('required', u'on'), ('name', u'short_text'), ('name', u'another'), ('submit', u'Submit')])
_

Python3.5まで

_dict(imd)
#output: {'default': [''], 'required': ['on'], 'name': ['short_text', 'another'], 'submit': ['Submit']}

imd.to_dict(flat=false)
#output: {'default': [''], 'required': ['on'], 'name': ['short_text', 'another'], 'submit': ['Submit']}

imd.to_dict(flat=True) # or imd.to_dict() 
#output: {'default': '', 'required': 'on', 'name': 'short_text', 'submit': 'Submit'}
_

したがって、

_dict(imd) == imd.to_dict(flat=False)
#output: True
_

Python3.6以降

_dict(imd)
#output: {'default': '', 'required': 'on', 'name': 'short_text', 'submit': 'Submit'}

imd.to_dict(flat=false)
#output: {'default': [''], 'required': ['on'], 'name': ['short_text', 'another'], 'submit': ['Submit']}

imd.to_dict(flat=True) # or imd.to_dict() 
#output: {'default': '', 'required': 'on', 'name': 'short_text', 'submit': 'Submit'}
_

したがって、

_dict(imd) == imd.to_dict(flat=False)
#output: False
_

.to_dict()を_flat=True/False_とともに使用する方が安全なオプションです。

2
Rakesh Sharma
>>> from werkzeug.datastructures import ImmutableMultiDict
>>> so = ImmutableMultiDict([('default', u''), ('required', u'on'), ('name', u'short_text'), ('name', u'another'), ('submit', u'Submit')])

# Most earlier answers have comments suggesting so.to_dict()
# It doesn't work, duplicates are lost like in a normal dict
>>> so.to_dict()
{'default': '', 'required': 'on', 'name': 'short_text', 'submit': 'Submit'}

# The response by Vb407 is better but litters lists everywhere
>>> dso = dict(so)
{'default': [''], 'required': ['on'], 'name': ['short_text', 'another'], 'submit': ['Submit']}

# We can achieve the requested state by cleaning this up
>>> { k: dso[k][0] if len(dso[k]) <= 1 else dso[k] for k in dso }
{'default': '', 'required': 'on', 'name': ['short_text', 'another'], 'submit': 'Submit'}
2
lod