2012-02-20 16 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 

Odpowiedzią na powyższe części kodu jest:Python/butelka/MongoDB: nieobsługiwany typ reakcji: <type 'dict'>

Error 500: Internal Server Error 

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

Unsupported response type: <type 'dict'> 

Jak mogę pobrać te informacje z Mongo jako typ butelki mogą powrócić jako JSON ?

+0

Czy próbowałeś dekomponować problem, tj. Zastępując wywołanie 'db.find' prostym słownikiem? Jeśli działa w ten sposób, problem musi być związany z Mongo. Czy nie, jest to związane z Butelką. – Helgi

+0

@Helgi Mam, butelka oczywiście działa ze zwykłym słownikiem dosłownie. Nie radzi sobie jednak z MongoDB ObjectId. –

Odpowiedz

2

Cały roztwór połączenie transformacji kursor dB do listy ręcznie ustawić typ odpowiedzi + zwyczaj kodowania wartości powrotu

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

moim przypadku tworzy to:

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

To była świetna pomoc. Miałem podobny problem, ale miałem problemy, ponieważ nie wiedziałem, skąd pochodzi MongoEncoder. ** Zwroty po prostu mi poszły. ** – Hectron

1

Zgodnie z opisem do dokumentu na butelce http://bottlepy.org/docs/dev/ należy zwrócić ciąg z dekoratora @route. Musisz zwrócić szablon z danymi lub ciągiem znaków.

Jeśli chcesz wygenerować json, musisz zmienić 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

Zwracam słownik i butelka zwraca błąd: Nieobsługiwany typ odpowiedzi: Również zwracanie ciągu znaków z @route nie ma znaczenia. –

+0

ustawiłeś typ zawartości? – Nilesh

+0

Występuje błąd - ustawienie typu zawartości powoduje jedynie wypisanie błędu HTML jako zwykłego tekstu. Problem polega na tym, że używam geoprzestrzennego z Mongo. Dokumenty do butelek nie obejmują tego. –

0

Mam ten błąd, gdy byłem tr ying, aby zwrócić listę python. Zakładałem, że przełoży się to na JSON, ale tak się nie stało. W pliku bottle.py dotarł do wiersza, w którym zajmowałby się iterabelami i znalazł pierwszy dict na liście i podał błąd powyżej.

Aby obejść ten problem, po prostu umieściłem listę wewnątrz dyktatury.

return {'response': []} 
+0

Jest to celowe. Zobacz to pytanie i odpowiedź, aby uzyskać więcej informacji: http://stackoverflow.com/questions/12293979/how-do-i-return-a-json-array-with-bottle – Peter

Powiązane problemy