Search code examples
pythonpymongobottle

Python/Bottle/MongoDB: Unsupported response type: <type '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

The response for the above portion of code is:

Error 500: Internal Server Error

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

Unsupported response type: <type 'dict'>

How can I grab that information from mongo as a type Bottle can return as JSON?


Solution

  • The complete solution was a combination of transforming the db cursor to a list, manually setting the response type + custom encoding the return value

    @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)
    

    In my case, produces this:

    [
        {
            "_id": "4f4201bb7e720d1dca000005",
            "coordinate2d": [
                33.02032100000006,
                -117.19483074631853
            ]
        },
        {
            "_id": "4f4201587e720d1dca000002",
            "coordinate2d": [
                33.158092999999994,
                -117.350594
            ]
        },
        {
            "_id": "4f42018b7e720d1dca000003",
            "coordinate2d": [
                33.195870000000006,
                -117.379483
            ]
        }
    ]