Причина, по которой выходные данные в списке tasks
имеют \"
, заключается в том, что отдельные элементы на самом деле являются строкой, а учитывая, что JSON использует символ "
для кавычек строк, литерал "
внутри него нужно экранировать, добавив перед ним символ экранирования, \
, что делает \"
. Поскольку вам, очевидно, не нужна строка, а реальный объект, вам просто не нужно кодировать этот объект в строку перед добавлением его в список.
Поэтому вместо
def post():
...
tasks.append(json.dumps({"id": len(tasks)+1, "title": title, "is_completed": "false"}))
Просто сделайте
tasks.append({"id": len(tasks)+1, "title": title, "is_completed": "false"})
Теперь, если вам нужен определенный c порядок вывода для ключей определенным c (не алфавитным c) способом, этот поток SO входит в детали позади этого. Вкратце, вы можете сделать это для функции post
:
import json
from collections import OrderedDict
from flask import Flask, request
app = Flask(__name__)
tasks = []
# Create a new task
@app.route('/v1/tasks', methods=['POST'])
def post():
data = request.get_json()
if "title" not in data:
return bulkadd(data)
title = data["title"]
tasks.append(OrderedDict((
('id', len(tasks) + 1),
('title', title),
('is_completed', False),
)))
index = len(tasks)
return json.dumps({"id": index}), 201
# List all tasks created
@app.route('/v1/tasks', methods=['GET'])
def getall():
app.logger.info({"tasks": tasks})
return json.dumps({"tasks": tasks}, indent=4)
Пример выполнения:
$ curl http://127.0.0.1:5000/v1/tasks --data '{"title": "hi"}' -H 'Content-Type: application/json'
{"id": 1}
$ curl http://127.0.0.1:5000/v1/tasks
{
"tasks": [
{
"id": 1,
"title": "hi",
"is_completed": false
}
]
}
Альтернатива, с использованием requests
(с последним достаточно версии, которая поддерживает ключевой аргумент json
):
>>> import requests
>>> r = requests.post('http://localhost:5000/v1/tasks', json={"title": "My First Task"})
>>> r.json()["id"]
1
>>> print(requests.get('http://localhost:5000/v1/tasks').text)
{
"tasks": [
{
"id": 1,
"title": "My First Task",
"is_completed": false
}
]
}
Возможно, вы захотите не заключать в кавычки false
для is_completed
(что я и сделал здесь), поскольку это превращает значение в строку вместо логического значения, которое вы, возможно, намереваетесь передать. Также обратите внимание, что для GET
версии этой конечной точки я добавил аргумент indent=4
для json.dumps
, чтобы было выполнено удобное форматирование, но учтите, что это увеличивает размер полезной нагрузки.