Python / Bottle / MongoDB: неподдерживаемый тип ответа: <type 'dict'> - PullRequest
5 голосов
/ 20 февраля 2012
@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'>

Как я могу получить эту информацию из Монго как тип Bottle, который может возвращаться как JSON?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Полное решение состояло в комбинации преобразования курсора базы данных в список, ручной настройки типа ответа + пользовательской кодировки возвращаемого значения

@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
        ]
    }
]
1 голос
/ 15 мая 2015

Я получил эту ошибку, когда пытался вернуть список питонов.Я предполагал, что это переведет в JSON, но это не так.Он добрался до строки в bottle.py, где он обработал бы итерации, нашел первый dict в списке и выдал ошибку выше.

Чтобы обойти это, я просто встроил свой список в dict.

return {'response': []}
1 голос
/ 20 февраля 2012

Согласно документу, указанному на бутылке http://bottlepy.org/docs/dev/, вы должны вернуть строку из декоратора @route. Вы должны вернуть шаблон с данными или строкой.

Если вы хотите сгенерировать JSON, вы должны изменить Content-Type.

Словари

Как уже упоминалось выше, словари Python (или подклассы их) автоматически преобразуются в строки JSON и возвращаются в браузер с заголовком Content-Type, установленным в application / json. Это облегчает реализацию API на основе json. Форматы данных другие чем JSON поддерживаются тоже. Смотрите tutorial-output-filter чтобы узнать больше.

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

...