Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Restful Web服务[PUT请求]_Python_Html_Flask - Fatal编程技术网

Python Restful Web服务[PUT请求]

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 {“消息”:“具有的用户不存在!”} 以下是我在网上自行研

我希望解决一个问题,使用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)
代码中有一些奇怪的东西:

  • 您不应该隐藏内置名称:名称
    id
    是python内置名称。在某些情况下,这可能导致无法预料的事情
  • id
    变量的列表理解中有一个输入错误:它说
    users['userid']
    ,但它应该是
    user['userid']
    (注意代码中的复数“s”)
  • 该方法需要一个参数
    userid
    ,但路由将该参数定义为
    id
    “/users/”
    )。它也应该是
    '/users/'
  • 你不需要理解列表,只要在列表上循环,一旦找到你的用户,你就完成任务并返回
  • 当找不到用户时,您的代码没有错误情况的逻辑。在我的示例代码中,可以看到我如何循环用户,当我退出循环时,也就是说我没有找到用户,我调用
    abort
    。它取消请求并返回错误代码(在本例中为404)
  • 默认情况下,flask使用端口5000,因此对端口8081的put请求将不起作用,但我猜这是由于将代码复制到堆栈溢出中
  • 是否确实要允许更新用户ID?这在问题中没有提到,而且通常在后端代码中这样做不是一个好主意,因为id是您的唯一标识符。如果它被更改,并且用户将其更改为已经存在的代码,那么您的代码可能会导致奇怪的行为
  • 在您的问题中,您表示希望返回
    200{“消息”:“已成功更新的用户!”}
    ,以防成功,但您的代码将返回更新后的用户。我不确定在这里选择哪个选项,所以我保留了用户的返回
这是相当多的信息,但是我想提供我在代码中的所有发现。也许这对你有帮助,你可以从中学到一些东西:)如果它仍然没有按预期的那样工作,请在下面留下评论和/或更新你的问题