[英]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.