我正在寻求解决一个问题,以使用 PUT 请求来更新资源
这是请求: 方法放置 => http://localhost:8081/user/int:id
BODY => {“email”:“abc@bmail.com”}
Req.json.matching 使用 for 循环 我是索引
响应应该是:
a)如果列表中存在匹配 id 的用户:
http 状态码 200 {“message”:“用户已成功更新!”}
b)如果列表中不存在匹配 id 的用户: http 状态码 404
{“message”: “用户不存在!”}
以下是我自己从网上研究后尝试的代码:
from flask import Flask,jsonify,request
app = Flask (__name__)
users=[{"userid":1,"username":"John","email":"john@gmailer.com","role":"member","password":"abc123"}]
@app.route('/users/<int:id>',methods=["PUT"])
def updateUser(userid):
id = [user for user in users if (users['userid'] == userid)]
if 'userid' in request.json:
id[0]['userid'] = request.json['userid']
if 'email' in request.json:
id[0]['email'] = request.json['email']
return jsonify({'user':id[0]})
if __name__ == '__main__':
app.run(debug=True) #server will auto-restart when we save our changes to the code
我无法得到想要的结果。任何帮助表示赞赏。
答案 0 :(得分:0)
首先,您的需求与代码的实际作用存在相当多的不匹配。我想出了一个代码片段,我认为它非常符合您的要求,但我仍然有一些未解决的问题。我会在答案的最后列出它们,以防我做出错误的假设。
from flask import Flask, jsonify, request, abort
app = Flask(__name__)
users = [{"userid": 1, "username": "John", "email": "john@gmailer.com", "role": "member", "password": "abc123"}]
@app.route('/users/<int:userid>', methods=["PUT"])
def updateUser(userid):
for user in users:
if user["userid"] == userid:
if 'userid' in request.json:
user['userid'] = request.json['userid']
if 'email' in request.json:
user['email'] = request.json['email']
return jsonify({'user': user})
abort(404)
if __name__ == '__main__':
app.run(debug=True)
您的代码中有一些奇怪的地方:
id
是 Python 内置名称。在某些情况下,这可能会导致不可预见的事情。id
变量的列表理解中有一个错字:它说 users['userid']
,但它应该是 user['userid']
(注意代码中的复数“s”)。< /li>
userid
,但路由将参数定义为 id
('/users/<int:id>'
)。它也应该是 '/users/<int:userid>'
。abort
。它取消请求并返回错误代码(在本例中为 404)。200 {“message”: “User with has been successfully updated!”}
,但您的代码返回更新后的用户。我不确定在这里选择哪个选项,所以我保留了用户的回访。这是相当多的信息,但我想提供我从您的代码中获得的所有发现。也许它对你有帮助,你可以从中学到一些东西:) 如果它仍然没有按预期工作,请在下面发表评论和/或更新你的问题。