POST 烧瓶中的方法 + mysql

POST method in flask + mysql

当我 运行 使用 POST 方法时出现错误:

AttributeError: 'dict' 对象没有 'create' 属性。

我试过其他方法在 table 中创建数据,但它们也不起作用。 GET、DELETE、PUT方法没有任何问题。

我该如何解决这个错误? 或者有另一种方法可以发出 POST 请求

这是我的应用程序代码:

from flask import Flask, request, jsonify, make_response
from flask_sqlalchemy import SQLAlchemy
from marshmallow import fields
from marshmallow_sqlalchemy import SQLAlchemySchema

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@localhost:5004/my_db'
db = SQLAlchemy(app)


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(20))
    lastname = db.Column(db.String(20))
    timestamp = db.Column(db.DateTime, nullable=False)

    def create(self):
        db.session.add(self)
        db.session.commit()
        return self

    def __init__(self, firstname, lastname, timestamp):
        self.firstname = firstname
        self.lastname = lastname
        self.timestamp = timestamp

    def __repr__(self):
        return f'{self.id}'


db.create_all()


class UsersSchema(SQLAlchemySchema):
    class Meta(SQLAlchemySchema.Meta):
        model = User
        sql_session = db.session

    id = fields.Number(dump_only=True)
    firstname = fields.String(required=True)
    lastname = fields.String(required=True)
    timestamp = fields.String(required=True)


# working
@app.route('/users', methods=['GET'])
def index():
    get_users = User.query.all()
    user_schema = UsersSchema(many=True)
    users = user_schema.dump(get_users)
    return make_response(jsonify({"user": users}))


# doesn't work
@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    user_schema = UsersSchema(data)
    user = user_schema.load(data)
    result = user_schema.dump(user.crete())
    return make_response(jsonify({"user": result}), 200)


# working
@app.route('/users/<id>', methods=['GET'])
def get_user_by_id(id):
    get_user = User.query.get(id)
    user_schema = UsersSchema()
    user = user_schema.dump(get_user)
    return make_response(jsonify({"user": user}))


# working
@app.route('/users/<id>', methods=['PUT'])
def update_user_by_id(id):
    data = request.get_json()
    get_user = User.query.get(id)
    if data.get('firstname'):
        get_user.firstname = data['firstname']
    if data.get('lastname'):
        get_user.lastname = data['lastname']
    db.session.add(get_user)
    db.session.commit()
    user_schema = UsersSchema(only=['id', 'firstname', 'lastname'])
    user = user_schema.dump(get_user)

    return make_response(jsonify({"user": user}))


# working
@app.route('/users/<id>', methods=['DELETE'])
def delete_user_by_id(id):
    get_user = User.query.get(id)
    db.session.delete(get_user)
    db.session.commit()
    return make_response("", 204)


if __name__ == "__main__":
    app.run(debug=True)

我认为你应该参考 this

没有@post_load方法,load()方法将return反序列化结果作为dict类型,而不是反序列化对象。所以 create() 方法失败,因为 dict 类型没有方法 create().

所以你应该在 UsersSchema class 中添加 @post_load 方法,如下所示。

class UsersSchema(SQLAlchemySchema):
    class Meta(SQLAlchemySchema.Meta):
        model = User
        sql_session = db.session

    id = fields.Number(dump_only=True)
    firstname = fields.String(required=True)
    lastname = fields.String(required=True)
    timestamp = fields.String(required=True)
    
    # you should add this.
    @post_load
    def make_user(self, data, **kwargs):
        return User(**data)