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