繁体   English   中英

flask + mysql 中的 POST 方法

[英]POST method in flask + mysql

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

AttributeError:“dict”object 没有“create”属性。

我尝试了其他方法在表中创建数据,但它们也不起作用。 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)

我认为你应该参考这个

如果没有@post_load方法, load()方法将返回反序列化的结果为dict类型,而不是反序列化的 object。 所以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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM