PUT请求不起作用,Flask-RESTful,SQLAlchemy

时间:2015-06-16 21:29:06

标签: flask sqlalchemy flask-sqlalchemy put flask-restful

我认为问题在于将更改提交到数据库(第3行到最后一行: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

2 个答案:

答案 0 :(得分:4)

git status更改为user.key = value

您没有在此设置所需的属性(setattr(user, key, value)),而是设置user.email。因为user.key可能不是数据库列字段(当然不是您要设置的字段),所以在调用user.key时,更改不会序列化到数据库。

答案 1 :(得分:0)

user.key 将不起作用,因为在循环args时,我们会得到键和值的字符串表示形式。 如果我们执行class_instance_name.key,它将不会指向属性名称,因为key不是属性名称,它只是一个字符串。

ex-这里的user.key类似于user.'username',因此它不起作用。

改为使用setattr(user, key, value)