python - traductor - ¿Cómo devuelvo una matriz JSON con Bottle?
python bottle tutorial (2)
El plugin JSON de Bottle espera que solo se devuelvan los dictados, no los arreglos. Existen vulnerabilidades asociadas con la devolución de matrices JSON: consulte, por ejemplo, esta publicación sobre el secuestro de JSON .
Si realmente necesita hacer esto, puede hacerlo, por ejemplo
@route(''/array'')
def returnarray():
from bottle import response
from json import dumps
rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
response.content_type = ''application/json''
return dumps(rv)
Estoy escribiendo un API usando Bottle , que hasta ahora ha sido fantástico. Sin embargo, me he encontrado con un pequeño obstáculo al intentar devolver una matriz JSON. Aquí está mi código de prueba de prueba:
from bottle import route, run
@route(''/single'')
def returnsingle():
return { "id": 1, "name": "Test Item 1" }
@route(''/containsarray'')
def returncontainsarray():
return { "items": [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }] }
@route(''/array'')
def returnarray():
return [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
run(host=''localhost'', port=8080, debug=True, reloader=True)
Cuando ejecuto esto y solicito cada ruta, obtengo las respuestas JSON que esperaría de las dos primeras rutas:
/soltero
{ id: 1, name: "Test Item 1" }
/ Contenidos
{ "items": [ { "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" } ] }
Por lo tanto, había esperado devolver una lista de diccionarios para crear la siguiente respuesta JSON:
[ { "id": 1, "name": "Test Object 1" }, { "id": 2, "name": "Test Object 2" } ]
Pero solicitar la ruta /array
solo produce un error. ¿Qué estoy haciendo mal y cómo puedo devolver una matriz JSON de esta manera?
Según la documentación de 0.12 de Bottle:
Como se mencionó anteriormente, los diccionarios de Python (o sus subclases) se transforman automáticamente en cadenas JSON y se devuelven al navegador con el encabezado Content-Type establecido en application / json. Esto facilita la implementación de API basadas en json. Los formatos de datos que no sean json también son compatibles. Consulte el tutorial-output-filter para obtener más información.
Lo que significa que no es necesario import json
ni establecer el atributo content_type de la respuesta.
Por lo tanto, el código se reduce enormemente:
@route(''/array'')
def returnarray():
rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
return dict(data=rv)
Y el documento JSON devuelto por el servidor web se vería así:
{"data": [{"id": 1, "name": "Test Item 1"}, {"id": 2, "name": "Test Item 2"}]}