2012-02-20 10 views
5
@route('/locations', method='GET') 
def get_location(): 
    entity = db['locations'].find({'coordinate2d': {'$near': [37.871593, -122.272747]}}).limit(3) 
    if not entity: 
     abort(404, 'No nearby locations') 
    return entity 

कोड के ऊपर हिस्से के लिए प्रतिक्रिया है:अजगर/बोतल/MongoDB: असमर्थित प्रतिक्रिया के प्रकार: <type 'dict'>

Error 500: Internal Server Error 

Sorry, the requested URL 'http://localhost:8080/locations' caused an error: 

Unsupported response type: <type 'dict'> 

मैं कैसे प्राप्त कर सकते हैं कि एक प्रकार के रूप में बोतल मोंगो से जानकारी JSON के रूप में लौट सकते हैं ?

+0

आप समस्या सड़ते की कोशिश की है, यानि कि एक साधारण शब्दकोश शाब्दिक साथ 'db.find' कॉल की जगह? अगर यह इस तरह से काम करता है, तो समस्या मोंगो से संबंधित होनी चाहिए। क्या यह नहीं है, यह बोतल से संबंधित है। – Helgi

+0

@ हेल्गी मेरे पास है, बेशक बोतल नियमित शब्दकोष के साथ काम करता है। हालांकि यह मोंगोडीबी ऑब्जेक्ट आईडी को संभाल नहीं सकता है। –

उत्तर

2

पूर्ण समाधान एक सूची के डाटाबेस कर्सर बदलने, मैन्युअल रूप से प्रतिक्रिया प्रकार की स्थापना + कस्टम एन्कोडिंग वापसी मान

@route('/locations/:lat/:lng', method='GET') 
def get_location(lat,lng): 
    response.content_type = 'application/json' 
    objdb = db.locations.find({'coordinate2d': {'$near': [lat,lng]}}, {'coordinate2d':bool(1)}).skip(0).limit(3) 
    entries = [entry for entry in objdb] 
    return MongoEncoder().encode(entries) 

मेरे मामले में का एक संयोजन था, का उत्पादन यह:

[ 
    { 
     "_id": "4f4201bb7e720d1dca000005", 
     "coordinate2d": [ 
      33.0000006, 
      -117.19483074631853 
     ] 
    }, 
    { 
     "_id": "4f4201587e720d1dca000002", 
     "coordinate2d": [ 
      33.158092999999994, 
      -117.350594 
     ] 
    }, 
    { 
     "_id": "4f42018b7e720d1dca000003", 
     "coordinate2d": [ 
      33.195870000000006, 
      -117.379483 
     ] 
    } 
] 
+0

यह बहुत मददगार था। मुझे एक ही समस्या का सामना करना पड़ रहा था, लेकिन मुझे समस्याएं थीं क्योंकि मुझे नहीं पता था कि मोंगोएन्कोडर कहां से आया था। ** बस प्रविष्टियों को लौटने के लिए मेरे लिए चाल थी। ** – Hectron

1

बोतल http://bottlepy.org/docs/dev/ पर उल्लेख किए गए दस्तावेज़ के अनुसार आपको @route सजावट से स्ट्रिंग को वापस करना होगा। आपको टेम्पलेट को डेटा या स्ट्रिंग के साथ वापस करना होगा।

यदि आप जेसन जेनरेट करना चाहते हैं तो आपको Content-Type बदलना होगा।

Dictionaries

As mentioned above, Python dictionaries (or subclasses thereof) are automatically transformed into JSON strings and returned to the browser with the Content-Type header set to application/json. This makes it easy to implement json-based APIs. Data formats other than json are supported too. See the tutorial-output-filter to learn more.

http://bottlepy.org/docs/dev/tutorial.html?highlight=json#generating-content

+0

मैं एक शब्दकोश लौटा रहा हूं और बोतल एक त्रुटि देता है: असमर्थित प्रतिक्रिया प्रकार: इसके अलावा, @route से एक स्ट्रिंग लौटने से कोई फर्क नहीं पड़ता। –

+0

क्या आपने सामग्री का प्रकार सेट किया है? – Nilesh

+0

सामग्री-प्रकार में त्रुटि-सेटिंग केवल त्रुटि HTML को सादा पाठ के रूप में प्रिंट करती है। समस्या यह है कि मैं मोंगो के साथ भू-स्थानिक का उपयोग कर रहा हूं। बोतल दस्तावेज़ों को कवर नहीं किया जाता है। –

0

मुझे यह त्रुटि मिली जब मैं tr था एक अजगर सूची वापस करने के लिए यिंग। मुझे लगता है कि यह जेएसओएन में अनुवाद करेगा, लेकिन ऐसा नहीं हुआ। यह इसे bottle.py में लाइन में बना देता है जहां यह पुनरावृत्तियों को संभाल लेगा और सूची में पहला नियम पाया और ऊपर की त्रुटि फेंक दी।

इस के आसपास पाने के लिए, मैंने बस अपनी सूची को एक निर्देश के अंदर एम्बेड किया।

return {'response': []} 
+0

यह जानबूझकर है। अधिक जानकारी के लिए यह प्रश्न और उत्तर देखें: http://stackoverflow.com/questions/12293979/how-do-i-return-a-json-array-with-bottle – Peter

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