Python Restful Web服务[PUT请求]
我希望解决一个问题,使用PUT请求更新资源 请求如下: 方法PUT=>http://localhost:8081/user/int:id 正文=>{“电子邮件”:abc@bmail.com“} Req.json.matching 用于循环 我是索引 而回应应该是: a) 如果列表中存在具有匹配id的用户: http状态代码200 {“消息”:“具有的用户已成功更新!”} b) 如果列表中不存在具有匹配id的用户: http状态代码404 {“消息”:“具有的用户不存在!”} 以下是我在网上自行研究后尝试的代码:Python Restful Web服务[PUT请求],python,html,flask,Python,Html,Flask,我希望解决一个问题,使用PUT请求更新资源 请求如下: 方法PUT=>http://localhost:8081/user/int:id 正文=>{“电子邮件”:abc@bmail.com“} Req.json.matching 用于循环 我是索引 而回应应该是: a) 如果列表中存在具有匹配id的用户: http状态代码200 {“消息”:“具有的用户已成功更新!”} b) 如果列表中不存在具有匹配id的用户: http状态代码404 {“消息”:“具有的用户不存在!”} 以下是我在网上自行研
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
从烧瓶导入烧瓶,jsonify,请求
app=烧瓶(名称)
users=[{“userid”:1,“username”:“John”,“email”:john@gmailer.com“,”角色“:”成员“,”密码“:”abc123“}]
@app.route('/users/',methods=[“PUT”])
def updateUser(用户ID):
id=[用户中的用户对应用户if(用户['userid']==用户id)]
如果request.json中有“userid”:
id[0]['userid']=request.json['userid']
如果request.json中有“email”:
id[0]['email']=request.json['email']
返回jsonify({'user':id[0]})
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run(debug=True)#当我们保存对代码的更改时,服务器将自动重新启动
我无法得到想要的结果。非常感谢您的帮助。首先,您的需求与代码的实际功能有很多不匹配之处。我提出了一个代码片段,我认为它非常符合您的要求,但我仍然有一些开放点。我会在答案的末尾列出它们,以防我做出错误的假设
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)
从烧瓶导入烧瓶,jsonify,请求,中止
app=烧瓶(名称)
users=[{“userid”:1,“username”:“John”,“email”:john@gmailer.com“,”角色“:”成员“,”密码“:”abc123“}]
@app.route('/users/',methods=[“PUT”])
def updateUser(用户ID):
对于用户中的用户:
如果用户[“userid”]==userid:
如果request.json中有“userid”:
用户['userid']=request.json['userid']
如果request.json中有“email”:
用户['email']=request.json['email']
返回jsonify({'user':user})
中止(404)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run(debug=True)
代码中有一些奇怪的东西:
- 您不应该隐藏内置名称:名称
是python内置名称。在某些情况下,这可能导致无法预料的事情id
- 在
变量的列表理解中有一个输入错误:它说id
,但它应该是users['userid']
(注意代码中的复数“s”)user['userid']
- 该方法需要一个参数
,但路由将该参数定义为userid
(id
)。它也应该是“/users/”
'/users/'
- 你不需要理解列表,只要在列表上循环,一旦找到你的用户,你就完成任务并返回
- 当找不到用户时,您的代码没有错误情况的逻辑。在我的示例代码中,可以看到我如何循环用户,当我退出循环时,也就是说我没有找到用户,我调用
。它取消请求并返回错误代码(在本例中为404)abort
- 默认情况下,flask使用端口5000,因此对端口8081的put请求将不起作用,但我猜这是由于将代码复制到堆栈溢出中
- 是否确实要允许更新用户ID?这在问题中没有提到,而且通常在后端代码中这样做不是一个好主意,因为id是您的唯一标识符。如果它被更改,并且用户将其更改为已经存在的代码,那么您的代码可能会导致奇怪的行为
- 在您的问题中,您表示希望返回
,以防成功,但您的代码将返回更新后的用户。我不确定在这里选择哪个选项,所以我保留了用户的返回200{“消息”:“已成功更新的用户!”}