![](/img/trans.png)
[英]\“ is converted to \\” while saving the string to dictionary in python
[英]Python Flask Ordered dictionary is converted to String
我編寫了一個網絡服務器,但在使用 bulkdelete 函數刪除任務時遇到了問題。
在刪除函數中,tasks 是一個 OrderedDicts 列表。 但是,在bulkdelete 函數中,返回的是字符串類型而不是我不理解的OrderedDict。 內容是否在某處進行了轉換,如何在 bulkdelete 函數中訪問 tasks[count]["id"] ? 目前它返回
TypeError: string indices must be integers, not str
在這里你可以看到我的整個代碼:
from flask import Flask, request, Response
import json
app = Flask(__name__)
from collections import OrderedDict
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)
completed=False
if "is_completed" in data:
completed=data["is_completed"]
title = data["title"]
tasks.append(OrderedDict((
('id', len(tasks) + 1),
('title', title),
('is_completed', completed),
)))
index = len(tasks)
return json.dumps({"id": index}), 201
#List all tasks created
@app.route('/v1/tasks', methods=['GET'])
def getall():
print(json.dumps({"tasks": tasks}))
return json.dumps({"tasks": tasks}), 200
#Get a specific task
@app.route('/v1/tasks/<id>', methods=['GET'])
def getone(id):
#This is wrong if one id is deleted and afterwards another one get
i=0
while i < len(tasks):
if tasks[i]["id"]==int(id):
return tasks[i], 200
i=i+1
return json.dumps({"error": "There is no task at that id"}), 404
#Delete a specific task
@app.route('/v1/tasks/<id>', methods=['DELETE'])
def delete(id):
#loop that iterates through the list, searches for "id" in each dict and if they match, the dict is deleted
i=0
print(type(tasks))
print(type(tasks[i]))
while i < len(tasks):
if tasks[i]["id"]==int(id):
del tasks[i-1]
return Response(status=204)
#(Extra Credit) Bulk delete tasks
@app.route('/v1/tasks/', methods=['DELETE'])
def bulkdelete():
data=request.get_json()
ids=data["tasks"]
cleaned_ids=[]
i = 0
#print(tasks)
while i < len(ids):
cleaned_ids.append(ids[i]["id"])
i=i+1
print(cleaned_ids)
for id in cleaned_ids:
count=0
while count < len(tasks):
print(tasks[count])
print(type(tasks[count]))
if tasks[count]["id"] == id:
print("delete")
del tasks[count]
count=count+1
print(tasks)
return Response(status=204)
#Edit the title or completion of a specific task
@app.route('/v1/tasks/<int:id>', methods=['PUT'])
def edit(id):
data=request.get_json()
i=0
while i < len(tasks):
if tasks[i]["id"] == id:
tasks[i]["title"]=data["title"]
tasks[i]["is_completed"]=data["is_completed"]
return Response(status=204)
i=i+1
return json.dumps({"error": "There is no task at that id"}), 404
#(Extra Credit) Bulk add tasks
def bulkadd(data):
content=data["tasks"]
output=[]
i=0
while i < len(content):
tasks.append(json.dumps({"id": len(tasks)+1, "title": content[i].get("title"), "is_completed": content[i].get("is_completed")}))
output.append({"id": len(tasks)})
i=i+1
return json.dumps({"tasks": output}), 201
您可以使用此代碼進行測試:
import requests
import json
def test_create_task():
r = requests.post('http://localhost:5000/v1/tasks', json={"title": "My First Task"})
assert isinstance(r.json()["id"], int)
assert len(r.json()) == 1
def test_list_all_tasks():
r = requests.get('http://localhost:5000/v1/tasks')
assert isinstance(r.json()["tasks"], list)
assert len(r.json()) == 1
print(r.json())
print(r.json()["tasks"][0]["id"])
assert isinstance(r.json()["tasks"][0]["id"], int)
assert isinstance(r.json()["tasks"][0]["title"], str)
assert isinstance(r.json()["tasks"][0]["is_completed"], bool)
assert len(r.json()["tasks"][0]) == 3
def test_get_task():
r = requests.get('http://localhost:5000/v1/tasks/1')
assert isinstance(r.json(),dict)
assert isinstance(r.json()["id"], int)
assert isinstance(r.json()["title"], str)
assert isinstance(r.json()["is_completed"], bool)
assert len(r.json()) == 3
def test_update_task():
r = requests.put('http://localhost:5000/v1/tasks/1', json={'title': "Test Task 2", 'is_completed': 'false'})
print(r.content)
assert not r.content
def test_delete_task():
r = requests.delete('http://localhost:5000/v1/tasks/1')
assert not r.content
def test_add_bulk_task():
r = requests.post('http://localhost:5000/v1/tasks', json={
"tasks": [
{"title": "Test Task 1", "is_completed": "true"},
{"title": "Test Task 2", "is_completed": "false"},
{"title": "Test Task 3", "is_completed": "true"}
]
})
print(r)
assert isinstance(r.json()["tasks"][0]["id"], int)
assert len(r.json()) == 1
def test_delete_bulk_task():
r = requests.delete('http://localhost:5000/v1/tasks/', json={
"tasks": [
{"id": 1},
{"id": 2},
{"id": 3}
]
})
print(r)
assert not r.content
感謝您的幫助!
問題是您的 tasks[i] 是一個字典,但采用字符串格式。 通過調試你的代碼,我在錯誤發生時得到了第一行:(第二行是你想要的任務[i],注意首先是一個字符串而不是一個字典)
問題出在 bulkadd 函數中,也可能出在您擁有的其他添加函數中。 當您使用 jsom.dumps({"key":"val"}) 時,它會創建一個字符串格式的字典,如:'{"key":"val"}'
當您在附加到任務列表時使用 json.dumps 時,我相信問題出在 bulkadd 函數(和其他添加函數)中。 因此,如果您在附加時刪除 main.dumps 應該可以解決問題,但您可以保留返回 json.dumps() 作為燒瓶應用程序的響應。 通過執行該任務[I] 將是一個 dict 而不是一個字符串格式的 dict
def bulkadd(data):
content=data["tasks"]
output=[]
i=0
while i < len(content):
tasks.append(json.dumps({"id": len(tasks)+1, "title": content[i].get("title"), "is_completed": content[i].get("is_completed")}))
output.append({"id": len(tasks)})
i=i+1
return json.dumps({"tasks": output}), 201
def bulkadd(data):
content=data["tasks"]
output=[]
i=0
while i < len(content):
tasks.append({"id": len(tasks)+1, "title": content[i].get("title"), "is_completed": content[i].get("is_completed")})
output.append({"id": len(tasks)})
i=i+1
return json.dumps({"tasks": output}), 201
在查看您的問題之前,我對您的代碼有幾點說明。 我會將任務存儲在字典中以便以后更容易刪除,而不是像現在那樣將字典存儲在列表中。
任務看起來像這樣:
tasks = {1: {'title': 'test', 'is_completed': False}, 2 : {'title': 'test2', 'is_completed': True}
批量刪除的改進方法如下所示:
data=request.get_json()
for task in data['tasks']:
del tasks[task['id']]
return Response(status=204)
使用所有的 while 循環和計數器並不是真正的 Pythonic,並且會導致您擁有更長的代碼,並且容易出錯。
我希望您能夠按照我的示例改進代碼的其他部分,如果您需要進一步的幫助,請讓我們保持最新狀態!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.