Python / Bouteille / MongoDB: type de réponse non prise en charge:
Question
@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 réaction ci-dessus pour la partie de code est:
Error 500: Internal Server Error
Sorry, the requested URL 'http://localhost:8080/locations' caused an error:
Unsupported response type: <type 'dict'>
Comment puis-je saisir cette information de mongo comme un type bouteille peut revenir JSON?
La solution
La solution complète est une combinaison de la transformation du pointeur de DB à une liste, réglant manuellement le type de réponse personnalisée + codant pour la valeur de retour
@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)
Dans mon cas, ce produit:
[
{
"_id": "4f4201bb7e720d1dca000005",
"coordinate2d": [
33.02032100000006,
-117.19483074631853
]
},
{
"_id": "4f4201587e720d1dca000002",
"coordinate2d": [
33.158092999999994,
-117.350594
]
},
{
"_id": "4f42018b7e720d1dca000003",
"coordinate2d": [
33.195870000000006,
-117.379483
]
}
]
Autres conseils
Selon la mention doc sur la bouteille http://bottlepy.org/docs/dev/ vous devez retourner la chaîne du décorateur @route
. Vous devez retourner le modèle avec des données ou chaîne.
Si vous voulez générer le JSON alors vous devez changer le Content-Type
.
Dictionnaires
Comme mentionné ci-dessus, les dictionnaires python (ou sous-classes celui-ci) sont automatiquement transformées en chaînes JSON et retournés au navigateur avec l'en-tête Content-Type ensemble à l'application / JSON. Cela rend plus facile à mettre en œuvre des API à base JSON. Formats de données autres que JSON sont trop pris en charge. Voir le tutoriel-sortie-filtre pour apprendre plus.
http://bottlepy.org/docs/dev/ tutorial.html? highlight = # JSON générateur de contenu
Je suis cette erreur quand je tentais de retourner une liste de python. Je suppose qu'il se traduirait par JSON, mais il n'a pas. Il fait à la ligne bottle.py où elle traiterait iterables et a trouvé la première dict dans la liste et l'erreur ci-dessus a jeté.
Pour contourner ce problème, je simplement EMBEDDED ma liste dans un dict.
return {'response': []}