Python/Bottle/MongoDB: Tipo di risposta non supportato:
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?
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': []}