2013-07-13 14 views
10

का उपयोग करते समय JSON serializable नहीं है। मैंने मोंगोडीबी के साथ काम करने के लिए फ्लास्क उदाहरण, मिनीटविट को फोर्क किया और यह फ्लास्क 0.9 पर ठीक काम कर रहा था, लेकिन 0.10 तक अपग्रेड करने के बाद। 1 जब मैं सत्र आईडी सेट करने का प्रयास करता हूं तो मुझे लॉगिन करते समय शीर्षक में त्रुटि मिलती है।'टाइप एरर प्राप्त करना: ऑब्जेक्टआईडी (' ') फ्लास्क 0.10.1

ऐसा लगता है कि changes फ्लास्क 0.10.1 में जेसन से संबंधित था।

कोड स्निपेट:

user = db.minitwit.user.find_one({'username': request.form['username']}) 
session['_id'] = user['_id'] 

मेरी github रेपो में पूर्ण कोड।

असल में, मैंने फ्लास्क सत्र आईडी को मोंगोडीबी से उपयोगकर्ता के _id पर सेट किया है।

मैंने सफलता के बिना इस SO question से पहले दो समाधानों की कोशिश की।

ठीक है, कर रही सत्र [ '_ आईडी'] = str (उपयोगकर्ता [ '_ आईडी']) त्रुटि संदेश से छुटकारा मिलता है और मैं ठीक से समय पृष्ठ पर पुनः निर्देशित कर रहा हूँ, लेकिन मैं वास्तव में लॉग इन नहीं कर रहा हूँ में।

मैं इसे कैसे ठीक कर सकता हूं?

संपादित करें: ट्रैस बैक की कॉपी/पेस्ट: http://pastebin.com/qa0AL1fk

धन्यवाद।

उत्तर

12

संपादित की साधारण मामले के लिए ठीक कर। आपको किसी भी JSON एन्कोडिंग/डिकोडिंग करने की आवश्यकता नहीं है।

बस एक स्ट्रिंग के रूप में बचाने के सत्र [ '_ आईडी']:

user = db.minitwit.user.find_one({'username': request.form['username']}) 
session['_id'] = str(user['_id']) 

और फिर हर जगह आप के साथ सत्र [ '_ आईडी'] क्या आप ObjectId साथ लपेट के लिए है (कुछ करना चाहता हूँ) तो यह मोंगोडीबी को ऑब्जेक्ट आईडी ऑब्जेक्ट के रूप में पास किया गया है।

if '_id' in session: 
    g.user = db.minitwit.user.find_one({'_id': session['_id']}) 

रहे हैं:

if '_id' in session: 
    g.user = db.minitwit.user.find_one({'_id': ObjectId(session['_id'])}) 

तुम मेरे github repo पर ठीक करने के लिए पूर्ण diff देख सकते हैं।

अगर किसी को यह जानने की परवाह है कि 'TypeError: ObjectId (' ') JSON serializable "" मुद्दा नहीं है, तो फ्लास्क 0.10.1 में दिखाई दिया, ऐसा इसलिए है क्योंकि वे सत्रों को संग्रहीत करने के तरीके को बदल देते हैं। अब उन्हें JSON के रूप में संग्रहीत किया जाता है, इसलिए मोंगोडीबी में '_id' ऑब्जेक्ट मानक JSON नहीं है, इसलिए यह सत्र टोकन को क्रमबद्ध करने में विफल रहा, इस प्रकार टाइप एरर दे रहा है।

session['_id'] = user['_id'].toString() 

विकल्प : http://flask.pocoo.org/docs/upgrading/#upgrading-to-010

9

JSON केवल क्रमशः ऑब्जेक्ट प्रकारों के सीमित सेट को क्रमबद्ध करने (एन्कोडिंग/डिकोडिंग) का समर्थन करता है। यद्यपि आप इस स्थिति को संभालने के लिए पायथन JSON के डिकोडर/एन्कोडर का विस्तार कर सकते हैं।

एक वस्तु जो ObjectID पर शामिल एन्कोडिंग के संदर्भ में, उदाहरण के लिए, जब ObjectIds क्लाइंट पक्ष है, जो कुछ का इंतजार कर सर्वर से साथ पारित हो जाएगा बनाई गई हैं, की कोशिश:

import json 
from bson.objectid import ObjectId 

class Encoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, ObjectId): 
      return str(obj) 
     else: 
      return obj 

फिर, अपने कोड में, डेटा ग्राहक को आगे बढ़ाने से पहले -> सर्वर, चलाएँ:

json.dumps(obj, cls=Encoder) 

सर्वर साइड, अगर हम जानते हैं कि हम मोंगो डॉक्स साथ काम कर रहे, (एक '_ id' कुंजी के साथ शब्दकोश वस्तु), हम एक json विकोडक हुक परिभाषित कर सकते हैं निम्न की तरह:

def decoder(dct): 
    for k, v in dct.items(): 
     if '_id' in dct: 
      try: 
       dct['_id'] = ObjectId(dct['_id']) 
      except: 
       pass 
     return dct 

और की तरह एक फोन का उपयोग कर इसे कहते निम्नलिखित: यहां तक ​​कि आसान:

doc = json.loads(in_doc, object_hook=decoder) 

आप शायद इस कोड थोड़ा अनुकूल करने के लिए की आवश्यकता होगी, लेकिन गुजर

0

यह कैसे मैं हाल ही में त्रुटि

@app.route('/') 
def home(): 
    docs = [] 
    for doc in db.person.find(): 
     doc.pop('_id') 
     docs.append(doc) 
    return jsonify(docs) 
0

toString स्ट्रिंग में बदल देता है और कहा कि कर सकते हैं सत्र के लिए संग्रहीत ठीक करने के बाद है: परिवर्तन के बारे में यहाँ पढ़ें session['_id'] = str(user['_id'])

उपरोक्त मेरे लिए त्रुटि तय की गई है।

संबंधित मुद्दे