【问题标题】:PUT request not working, Flask-RESTful, SQLAlchemyPUT 请求不起作用,Flask-RESTful,SQLAlchemy
【发布时间】:2015-09-01 22:04:39
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    user.key = value 更改为setattr(user, key, value)

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

    【讨论】:

      【解决方案2】:

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

      ex - 这里 user.key 就像 user.'username' 所以它不应该工作。

      改用setattr(user, key, value)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-20
        • 2018-05-20
        • 2017-10-08
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        相关资源
        最近更新 更多