Frage

@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

Die Antwort für den obigen Teil des Codes lautet:

Error 500: Internal Server Error

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

Unsupported response type: <type 'dict'>

Wie kann ich diese Informationen von Mongo als Typ Flasche als JSON zurückkehren?

War es hilfreich?

Lösung

Die vollständige Lösung war eine Kombination aus Transformation des DB -Cursors in eine Liste, wodurch der Antworttyp + benutzerdefinierte Codierung des Rückgabewerts manuell festgelegt wurde

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

In meinem Fall produziert dies:

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

Andere Tipps

Gemäß der Doc -Erwähnung auf der Flasche http://boTtlepy.org/docs/dev/ Sie müssen die Zeichenfolge von der zurückgeben @route Dekorateur. Sie müssen die Vorlage mit Daten oder String zurückgeben.

Wenn Sie den JSON generieren möchten, müssen Sie die ändern Content-Type.

Wörterbücher

Wie oben erwähnt, werden Python-Wörterbücher (oder Unterklassen davon) automatisch in JSON-Zeichenfolgen umgewandelt und mit dem auf Application/JSON eingestellten Inhaltsheader zum Browser zurückgegeben. Dies erleichtert die Implementierung von JSON-basierten APIs. Auch Datenformate als JSON werden unterstützt. Siehe den Tutorial-Output-Filter, um mehr zu erfahren.

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

Ich habe diesen Fehler bekommen, als ich versuchte, eine Python -Liste zurückzugeben. Ich nahm an, dass es sich in JSON übersetzen würde, aber es tat es nicht. Es schaffte es in die Linie in bottle.py, wo es iterable verwandelt und das erste Diktieren in der Liste gefunden und den Fehler oben warf.

Um dies zu umgehen, habe ich einfach meine Liste in einen Diktat eingebettet.

return {'response': []}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top