Restful Web 服务 [PUT 请求]

时间:2021-05-26 08:19:58

标签: python html flask

我正在寻求解决一个问题,以使用 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 

我无法得到想要的结果。任何帮助表示赞赏。

1 个答案:

答案 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)。
  • 默认情况下,flask 使用端口 5000,因此您对端口 8081 的 put 请求将不起作用,但我猜这是由于将代码复制到堆栈溢出。
  • 您真的要允许更新用户 ID 吗?问题中没有提到这一点,通常在后端代码中,这样的事情不是一个好主意,因为 id 是您的唯一标识符。如果它被更改并且用户将其更改为已经存在的代码,则您的代码可能会导致奇怪的行为。
  • 在您的问题中,您说如果成功,您想返回 200 {“message”: “User with has been successfully updated!”},但您的代码返回更新后的用户。我不确定在这里选择哪个选项,所以我保留了用户的回访。

这是相当多的信息,但我想提供我从您的代码中获得的所有发现。也许它对你有帮助,你可以从中学到一些东西:) 如果它仍然没有按预期工作,请在下面发表评论和/或更新你的问题。