【发布时间】:2020-02-28 01:14:08
【问题描述】:
我的 Flask 服务器的 post 和 get 函数如下所示:
from flask import Flask, request
import json
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(json.dumps({"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})
两次调用 post 后,get 的输出如下:
{"tasks": ["{\"is_completed\": \"false\", \"id\": 1, \"title\":\"Test Task 2\"}", "{\"is_completed\": \"false\", \"id\": 2, \"t:03] "POST /v1/tasks HTTP/1.1" 201 -itle\": \"Test Task 2\"}"]}
相反,这就是我想要的输出格式:
{
tasks: [
{id: 1, title: "Test Task 1", is_completed: true},
{id: 2, title: "Test Task 2", is_completed: false}
]
}
为什么顺序不同,“\”是什么意思?
感谢您的帮助!
编辑 1: 你能帮我解释一下为什么下面的 post 函数测试会抛出这个错误吗?:
这不会生成有效的 json 吗?
return json.dumps({"id": index}), 201
_____________________________________ test_create_task _____________________________________
def test_create_task():
r = requests.post('http://localhost:5000/v1/tasks', json={"title": "My First Task"})> assert isinstance(r.json()["id"], int)
project1-test3.py:6:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/home/alexanderfarr/.local/lib/python3.6/site-packages/requests/models.py:898: in json
return complexjson.loads(self.text, **kwargs)
/usr/lib/python3/dist-packages/simplejson/__init__.py:518: in loads
return _default_decoder.decode(s)
/usr/lib/python3/dist-packages/simplejson/decoder.py:370: in decode
obj, end = self.raw_decode(s)
【问题讨论】:
-
您的示例输出不是有效的 JSON。
-
@KlausD。如何更改我的代码以创建有效的 JSON?
-
@KlausD。它是有效的JSON,只是内部项目是双重编码的。我的回答提供了完整的解释。
-
@metatoaster 我一直在谈论他想要的输出与未引用的键。
-
@KlausD。哦,我在实际发布的内容上一定没有滚动足够远,但我的评估基于代码应该产生的输出,而不是实际粘贴到问题中的内容(与控制台输出混合,有时复制/粘贴会导致奇怪)。
标签: python json python-3.x flask