PUT 请求不工作,Flask-RESTful,SQLAlchemy
PUT request not working, Flask-RESTful, SQLAlchemy
我认为问题在于将更改提交到数据库(倒数第三行:db.session.commit()
)。以用户为例:username="Foo", email="Bar@yahoo.com"。如果我在 PUT 请求正文中放入 {"email":"changed@gmail.com"},则在赋值后打印 'user.email' 表明该值实际上已更改。然而,之后查询数据库时,电子邮件保持不变。无论如何,我真的很难弄清楚我遗漏了什么,所以感谢您的帮助!
class UserAPI(Resource):
def __init__(self):
self.parser = reqparse.RequestParser()
self.parser.add_argument('username', type=str, location='json')
self.parser.add_argument('email', type=str, location='json')
self.parser.add_argument('password', type=str, location='json')
super(UserAPI, self).__init__()
def put(self, id):
# Not working
user = User.query.filter_by(id=id).first()
if user is not None:
args = self.parser.parse_args()
for key, value in args.items():
if args[key] is not None:
user.key = value
db.session.commit()
return {"user": marshal(user,user_field) }
return {"error": "User not found"}, 404
将 user.key = value
更改为 setattr(user, key, value)
。
您在这里设置的不是您想要的属性 (user.email
),而是设置 user.key
。因为 user.key
可能不是数据库列字段(当然也不是您打算设置的字段),所以调用 db.session.commit()
时不会将更改序列化到数据库。
user.key 将不起作用,因为在循环 args 时我们得到键和值的字符串表示。
如果我们这样做 class_instance_name.key 它不会指向属性名称因为键不是属性名称它只是一个字符串。
ex - 这里 user.key 就像用户。'username' 所以它不应该工作。
改用setattr(user, key, value)
我认为问题在于将更改提交到数据库(倒数第三行:db.session.commit()
)。以用户为例:username="Foo", email="Bar@yahoo.com"。如果我在 PUT 请求正文中放入 {"email":"changed@gmail.com"},则在赋值后打印 'user.email' 表明该值实际上已更改。然而,之后查询数据库时,电子邮件保持不变。无论如何,我真的很难弄清楚我遗漏了什么,所以感谢您的帮助!
class UserAPI(Resource):
def __init__(self):
self.parser = reqparse.RequestParser()
self.parser.add_argument('username', type=str, location='json')
self.parser.add_argument('email', type=str, location='json')
self.parser.add_argument('password', type=str, location='json')
super(UserAPI, self).__init__()
def put(self, id):
# Not working
user = User.query.filter_by(id=id).first()
if user is not None:
args = self.parser.parse_args()
for key, value in args.items():
if args[key] is not None:
user.key = value
db.session.commit()
return {"user": marshal(user,user_field) }
return {"error": "User not found"}, 404
将 user.key = value
更改为 setattr(user, key, value)
。
您在这里设置的不是您想要的属性 (user.email
),而是设置 user.key
。因为 user.key
可能不是数据库列字段(当然也不是您打算设置的字段),所以调用 db.session.commit()
时不会将更改序列化到数据库。
user.key 将不起作用,因为在循环 args 时我们得到键和值的字符串表示。 如果我们这样做 class_instance_name.key 它不会指向属性名称因为键不是属性名称它只是一个字符串。
ex - 这里 user.key 就像用户。'username' 所以它不应该工作。
改用setattr(user, key, value)