2012-02-20 9 views
5
@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 

Ответ на выше части кода:Python/бутылки/MongoDB: неподдерживаемый тип ответа: <type 'dict'>

Error 500: Internal Server Error 

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

Unsupported response type: <type 'dict'> 

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

+0

Вы пытались разложить проблему, т. Е. Заменить вызов 'db.find' простым литералом словаря? Если это сработает, проблема должна быть связана с Монго. Разве это не так, это связано с бутылками. – Helgi

+0

@Helgi У меня есть, Бутылка, конечно, работает с обычным словарным литералом. Однако он не может обрабатывать объекты MongoDB ObjectId. –

ответ

2

Комплексное решение представляет собой сочетание преобразования БД курсор в виде списка, ручной установкой тип ответа + пользовательские кодирующий возвращаемое значение

@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.0000006, 
      -117.19483074631853 
     ] 
    }, 
    { 
     "_id": "4f4201587e720d1dca000002", 
     "coordinate2d": [ 
      33.158092999999994, 
      -117.350594 
     ] 
    }, 
    { 
     "_id": "4f42018b7e720d1dca000003", 
     "coordinate2d": [ 
      33.195870000000006, 
      -117.379483 
     ] 
    } 
] 
+0

Это была отличная помощь. Я столкнулся с подобной проблемой, но у меня были проблемы, так как я не знал, откуда пришел MongoEncoder. ** Просто возвращающиеся записи сделали трюк для меня. ** – Hectron

1

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

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

Dictionaries

As mentioned above, Python dictionaries (or subclasses thereof) are automatically transformed into JSON strings and returned to the browser with the Content-Type header set to application/json. This makes it easy to implement json-based APIs. Data formats other than json are supported too. See the tutorial-output-filter to learn more.

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

+0

Я возвращаю словарь, и Bottle возвращает ошибку: Неподдерживаемый тип ответа: Кроме того, возврат строки из @route не имеет значения. –

+0

Вы задали тип контента? – Nilesh

+0

Существует ошибка установки типа содержимого, который просто печатает ошибку HTML как обычный текст. Проблема в том, что я использую геопространственный с Монго. Документы с бутылкой не покрывают это. –

0

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

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

return {'response': []} 
+0

Это намеренно. См. Этот вопрос и ответ для получения дополнительной информации: http://stackoverflow.com/questions/12293979/how-do-return-a-json-array-with-bottle – Peter

Смежные вопросы