2012-11-23 43 views
11

के लिए उपयुक्त है, मैं फ्लास्क और मोंगोडीबी का उपयोग कर रहा हूं। मैं Pymongo के माध्यम से बचत के लिए उपयुक्त कुछ में request.form की सामग्री को बदलने की कोशिश कर रहा हूं। ऐसा कुछ ऐसा लगता है जो तैयार किए गए समाधान के लिए अक्सर आना चाहिए।फ्लास्क में POST ऑब्जेक्ट को एक प्रतिनिधित्व में परिवर्तित करें जो mongodb

तो क्या बोतल मुझे दे की तरह कुछ है:

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

आपको लगता है कि आवश्यकता क्यों है? आप मूल्यों तक पहुंच सकते हैं जैसे आप इसे परिवर्तित किए बिना शब्दकोश में एक्सेस करते हैं। जैसे डी ['आवश्यक'] आपको बदले में सच देता है। –

+0

@Abdul, अगर आप ImmutableNutiDict() के माध्यम से लूप करना चाहते हैं, तो आप सामान्य रूप से शब्दकोश की तरह ही कर सकते हैं, लेकिन यदि आप इसे पूरी तरह से एक dict के रूप में उपयोग करना चाहते हैं, उदाहरण के लिए, z = {** x का उपयोग करके शब्दकोश मर्ज करें, ** y}, तो यह काम नहीं करता है, मान के चारों ओर वर्ग होंगे, जैसे {..., 'name': ['short_text'],}। – zhihong

उत्तर

15
>>> 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

+5

बस '.to_dict()' विधि जैसे 'imd.to_dict()' का उपयोग करें। इस तरह हर मूल्य एक सूची नहीं है, जैसे आपके समाधान में। इसके अलावा आपको ImmutableMultiDict – wordsforthewise

+1

आयात करने की आवश्यकता नहीं होगी, मैं शायद इस उत्तर को अद्यतन करने के लिए सुझाव देता हूं कि टिप्पणी क्या करती है। '.to_dict()' का उपयोग सूचियों के रूप में उन मानों को हटाने के लिए यहां जाने का तरीका होगा।मैं आपका उत्तर इस तरह रखूंगा, लेकिन इसमें शामिल हूं और 'to_dict()' का उपयोग करने में अंतर प्रदर्शित करता हूं। – idjaw

+0

imd.to_dict() उचित नहीं है क्योंकि यह डुप्लिकेट प्रविष्टि – lod

-2

बार जब आप एक अजगर शब्दकोश है, यह अपेक्षाकृत है:

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

और क्या मैं पाने के लिए देख रहा हूँ इस के पास कुछ है इसे JSON में बदलने के लिए आसान है।

import json 

mdict = {'default' : u'', 'required': u'on', 'name': u'short_text', 'name': u'another', 'submit': u'Submit'} 
json_value = json.dumps(mdict, separators=(',',':')) 

पुनश्च: अपने शब्दकोश मान mdict है मुझे लगता है कि परिवर्तनशील dicts एक to_dict() विधि उन्हें एक नियमित शब्दकोश में कन्वर्ट करना होगा।

15

आप इस

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

की तरह कोड लिखने के लिए WERKZEUG के getlist उपयोग कर सकते हैं अब 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 कॉल कर रहे हैं। आप एक लूप लिख सकते हैं और इसके चारों ओर ले सकते हैं।

13

फ्लास्क ImmutableMultiDict डेटा संरचना to_dict विधि में निर्मित है।

यह ज्ञान फ्लास्क request ऑब्जेक्ट form संपत्ति के अलावा ImmutableMultiDict संपत्ति को मोंगोडीबी को एक फॉर्म पोस्ट अनुरोध के सरल संचालन के लिए अनुमति देता है।

एक अनुभवहीन उदाहरण के लिए नीचे देखें:

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

request.form.to_dict() प्राप्त होते हैं आपको क्या चाहिए

0
>>> 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'}