Как вернуть массив JSON с помощью Bottle?

Я пишу API с использованием Bottle , который до сих пор был фантастическим. Тем не менее, я столкнулся с небольшим препятствием при попытке вернуть массив JSON. Вот мой тестовый код приложения:

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) 

Когда я запускаю это и запрашиваю каждый маршрут, я получаю ответы JSON, которые я ожидаю от первых двух маршрутов:

/Один

 { id: 1, name: "Test Item 1" } 

/ containsarray

 { "items": [ { "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" } ] } 

Итак, я ожидал вернуть список словарей, чтобы создать следующий ответ JSON:

 [ { "id": 1, "name": "Test Object 1" }, { "id": 2, "name": "Test Object 2" } ] 

Но запрос маршрута /array просто приводит к ошибке. Что я делаю неправильно, и как я могу вернуть массив JSON таким образом?

2 Solutions collect form web for “Как вернуть массив JSON с помощью Bottle?”

Плагин JSON для бутылок ожидает, что будут возвращены только дикты, а не массивы. Существуют уязвимости, связанные с возвратом массивов JSON – см., Например, эту статью о захвате JSON .

Если вам действительно нужно это сделать, это можно сделать, например

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

Согласно документации Bottle 0.12:

Как упоминалось выше, словари Python (или их подклассы) автоматически преобразуются в строки JSON и возвращаются в браузер с заголовком Content-Type, установленным в application / json. Это упрощает реализацию json-based API. Также поддерживаются форматы данных, отличные от json. Дополнительную информацию см. В разделе «Учебник-Выход-фильтр».

Это означает, что вам не нужно import json или не устанавливать атрибут content_type ответа.

Таким образом, код значительно сокращается:

 @route('/array') def returnarray(): rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }] return dict(data=rv) 

И документ JSON, возвращенный веб-сервером, будет выглядеть так:

 {"data": [{"id": 1, "name": "Test Item 1"}, {"id": 2, "name": "Test Item 2"}]} 
  • Есть ли способ сделать Flask более подробным?
  • Усреднение по всем n элементам массива numpy
  • Python Fabric дает: Неустранимая ошибка: нет существующего сеанса
  • Задержка цикла Python без time.sleep ()
  • Как динамически создавать функции уровня модуля из методов в классе
  • Только текст тела
  • Создание именованного элемента с пользовательской хэш-функцией
  • Врезной список
  • Python - лучший язык программирования в мире.