类型错误:列表索引必须是整数或切片,而不是 str.在邮递员中测试时



我在测试时尝试从 POSTMAN 运行 POST 方法,但我收到一些错误,我找不到任何解决方案。

以下是 Python 中应用程序的代码:

在这里,我创建了商店列表:

stores = [
{
'name':'Mart',
'items':[{'name':'Item1','price':120}]
}
]

开机自检 - 用于接收数据

GET - 仅用于发回数据

为主页创建端点:

@app.route('/')
def home():
return render_template('index.html')

创建用于创建新商店的端点:

# POST /store data: {name:}
@app.route('/store', methods=['POST'])
def create_store():
request_data = request.get_json()
new_store = {
'name':request_data['name'],
'items':[]
}
stores.append(new_store)
return jsonify(new_store)

创建用于获取特定存储的终结点:

# GET /store/<string: name>
# 'hppt://127.0.0.1:5000/store/some_name
@app.route('/store/<string:name>')   
def get_store(name):
# iterate over stores
for store in stores:
# if the store name matches, return it
if store['name'] == name:
return jsonify(store)
# if none match, return an error message
return jsonify({'ERROR': 'Store Not Found!'})

创建用于获取所有存储的终结点

# GET /store
@app.route('/store')   
def get_stores():
return jsonify({'stores':stores})

创建用于在特定商店中创建项目的端点:

# POST /store/<string: name>/item {name:, price:}
@app.route('/store/<string:name>/item',methods=['POST'])   
def create_items_in_store(name):
request_data = request.get_json()
for store in stores:
if store['name'] == name:
new_item = {
'name': request_data['name'],
'price': request_data['price']
}
stores['items'].append(new_item)
return jsonify(new_item)
return jsonify({'ERROR': 'Item could not be added!'})

创建用于从特定商店获取商品的端点:

# GET /store/<string: name>/item
@app.route('/store/<string:name>/item')   
def get_items_in_store(name):
for store in stores:
if store['name'] == name:
return jsonify({'items': store['items']})
return jsonify({'ERROR': 'Item Not Found in Store!'})

在端口上运行应用:5000

app.run(port=5000)

邮差:

URL:'http://127.0.0.1:5000/store/Mart/item'

开机自检请求是:

{
"name":"peanuts",
"price": 340
}

我收到的错误是:

File "e:CoursesOnline_PracticeREST_API1_First_REST_APIapp.py", line 64, in create_items_in_store
stores['items'].append(new_item)
TypeError: list indices must be integers or slices, not str

你的代码中有拼写错误

for store in stores:
if store['name'] == name:
new_item = {
'name': request_data['name'],
'price': request_data['price']
}
stores['items'].append(new_item)

在最后一行,您正在修改基于错误和代码的stores是一个列表,而不是字典store。 你可能想做store['items'].append(new_item)

for store in stores:
if store['name'] == name:
new_item = {
'name': request_data['name'],
'price': request_data['price']
}
stores['items'].append(new_item)

问题是stores是所有存储的数组,即字典列表。并且名称的元素没有命名,您只能使用索引访问它们。

试试这个:

for index, store in enumerate(stores):
if store['name'] == name:
new_item = {
'name': request_data['name'],
'price': request_data['price']
}
stores[index].append(new_item)

最新更新