37

私はBottleを使って API を書いていますが、これはこれまで素晴らしいものでした。ただし、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)

これを実行して各ルートをリクエストすると、最初の 2 つのルートから期待される JSON 応答が得られます。

/独身

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

/含む配列

{ "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 配列を返すにはどうすればよいですか?

4

2 に答える 2

81

ボトルの 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)
于 2012-09-06T06:33:10.177 に答える
20

ボトルの 0.12 ドキュメントによると:

前述のように、Python 辞書 (またはそのサブクラス) は自動的に JSON 文字列に変換され、Content-Type ヘッダーが application/json に設定された状態でブラウザーに返されます。これにより、json ベースの API を簡単に実装できます。json 以外のデータ形式もサポートされています。詳細については、tutorial-output-filter を参照してください。

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)

Web サーバーから返される JSON ドキュメントは次のようになります。

{"data": [{"id": 1, "name": "Test Item 1"}, {"id": 2, "name": "Test Item 2"}]}
于 2015-10-12T02:40:29.460 に答える