Pregunta

@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 respuesta para la parte anterior del código es:

Error 500: Internal Server Error

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

Unsupported response type: <type 'dict'>

¿Cómo puedo obtener esa información de Mongo como una botella de tipo puede regresar como JSON?

¿Fue útil?

Solución

La solución completa fue una combinación de transformación del cursor de DB en una lista, configurando manualmente el tipo de respuesta + codificación personalizada del valor de retorno

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

En mi caso, produce esto:

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

Otros consejos

Según la mención del documento en la botella http://bottlepy.org/docs/dev/ Tienes que devolver la cadena del @route decorador. Tiene que devolver la plantilla con datos o cadenas.

Si quieres generar el JSON, entonces tienes que cambiar el Content-Type.

Diccionarios

Como se mencionó anteriormente, los diccionarios de Python (o subclases de los mismos) se transforman automáticamente en cadenas JSON y se devuelven al navegador con el encabezado de tipo contenido establecido en Application/JSON. Esto facilita la implementación de API basadas en JSON. Los formatos de datos distintos de JSON también son compatibles. Vea el filtro de salida tutorial para obtener más información.

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

Recibí este error cuando intentaba devolver una lista de Python. Asumí que se traduciría en JSON, pero no lo hizo. Llegó a la línea en Bottle.py, donde manejaría Iterables y encontró el primer dict en la lista y arrojó el error anterior.

Para evitar esto, simplemente incrusté mi lista dentro de un dict.

return {'response': []}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top