Domanda

@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

La risposta per la parte sopra del codice è:

Error 500: Internal Server Error

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

Unsupported response type: <type 'dict'>

Come posso afferrare queste informazioni da Mongo come bottiglia di tipo può tornare come JSON?

È stato utile?

Soluzione

La soluzione completa era una combinazione di trasformazione del cursore DB in un elenco, impostando manualmente il tipo di risposta + codifica personalizzata del valore di ritorno

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

Nel mio caso, produce questo:

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

Altri suggerimenti

Secondo il dottore menziona la bottiglia http://bottlepy.org/docs/dev/ devi restituire la stringa da @route decoratore. È necessario restituire il modello con dati o stringa.

Se vuoi generare JSON, devi cambiare il Content-Type.

Dizionari

Come accennato in precedenza, i dizionari di Python (o le loro sottoclassi) vengono automaticamente trasformati in stringhe JSON e restituiti al browser con l'intestazione del contenuto impostato su Application/JSON. Ciò semplifica l'implementazione di API basate su JSON. Anche i formati di dati diversi da JSON sono supportati. Vedi il filtro del tutorial-output per saperne di più.

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

Ho ricevuto questo errore quando stavo cercando di restituire un elenco di Python. Ho pensato che si sarebbe tradotto in JSON, ma non è così. È arrivato alla linea in bottiglia.py dove avrebbe gestito iterable e ha trovato il primo detto nell'elenco e ha lanciato l'errore sopra.

Per aggirare questo, ho semplicemente incorporato la mia lista all'interno di un detto.

return {'response': []}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top