Python/Bottle/MongoDB: неподдерживаемый тип ответа: <тип 'dict'>
Вопрос
@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
Ответ на вышеуказанную часть кода составляет:
Error 500: Internal Server Error
Sorry, the requested URL 'http://localhost:8080/locations' caused an error:
Unsupported response type: <type 'dict'>
Как я могу взять эту информацию из Mongo в качестве бутылки типа, которая может вернуться в качестве JSON?
Решение
Полным решением была комбинация преобразования курсора DB в список, вручную настройку типа ответа + пользовательский кодирование возвращаемого значения
@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)
В моем случае создает это:
[
{
"_id": "4f4201bb7e720d1dca000005",
"coordinate2d": [
33.02032100000006,
-117.19483074631853
]
},
{
"_id": "4f4201587e720d1dca000002",
"coordinate2d": [
33.158092999999994,
-117.350594
]
},
{
"_id": "4f42018b7e720d1dca000003",
"coordinate2d": [
33.195870000000006,
-117.379483
]
}
]
Другие советы
Согласно упоминанию доктора на бутылке http://bottlepy.org/docs/dev/ Вы должны вернуть строку из @route
декоратор. Вы должны вернуть шаблон с помощью данных или строки.
Если вы хотите генерировать JSON, то вам нужно изменить Content-Type
.
Словари
Как упомянуто выше, словарь Python (или их подклассы) автоматически трансформируются в строки JSON и возвращаются в браузер с заголовком типа контента, установленным в Application/JSON. Это позволяет легко реализовать API на основе JSON. Форматы данных, отличные от JSON, также поддерживаются. Смотрите учебник-выпуск-фильтр, чтобы узнать больше.
http://bottlepy.org/docs/dev/tutorial.html?highlight=json#generating-content
Я получил эту ошибку, когда пытался вернуть список Python. Я предположил, что это приведет к JSON, но это не так. Он добрался до линии в бутылке.
Чтобы обойти это, я просто включил свой список в дикта.
return {'response': []}