Как вернуть массив 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 таким образом?

  • Как определить, относится ли число к определенному диапазону в Python?
  • Как получить массив из значений RGB растрового изображения?
  • Ткань запрашивает пароль root
  • Python / Scipy - внедрение sigma optimize.curve_fit в optimize.leastsq
  • Python: получение правильной длины строки, когда она содержит суррогатные пары
  • Отключить кеш на определенной странице с помощью Flask
  • Приложение Flask зависает при обработке запроса
  • Множество петель Python одновременно
  • 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"}]} 
    Python - лучший язык программирования в мире.