Flask注册用户时报缺少mic_submit、mic_checkin必填参数如何解决?
报错原因
你自定义的User类__init__构造方法强制要求必须传入mic_submit、mic_checkin两个位置参数,但你在注册接口创建User实例时仅传入了5个业务字段,没有传这两个关联字段,因此触发参数缺失的类型错误。
解决步骤
1. 修复User模型构造逻辑(二选一即可)
方案1:删除自定义的__init__方法
Flask-SQLAlchemy的db.Model基类已经内置了适配所有模型字段的默认构造方法,你额外定义的构造方法反而增加了不必要的参数限制,删除后即可直接按你现有代码的方式创建User实例,关系字段会自动初始化为空的关联集合。
修改后的User类参考代码:
class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(60), nullable=False) base_city = db.Column(db.String(120), nullable=False) about_me = db.Column(db.String(1000), nullable=False, default='comedy!') mic_submit = db.relationship('Mic', backref='initiator', lazy=True) mic_checkin = db.relationship('Checkins', backref='signee', lazy=True) def __repr__(self): return f"User('{self.username}','{self.email}', '{self.password}', '{self.base_city}', '{self.about_me}', '{self.mic_submit}','{self.mic_checkin}')"
方案2:保留自定义__init__,给关联字段设置默认值
如果你需要保留自定义构造逻辑,直接给两个关联字段设置默认值None即可,不需要传参时会自动使用默认空值:
def __init__(self, username, email, password, base_city, about_me, mic_submit=None, mic_checkin=None): self.username = username self.email = email self.password = password self.base_city = base_city self.about_me = about_me self.mic_submit = mic_submit self.mic_checkin=mic_checkin
2. 修复前端请求参数序列化错误
你当前前端代码的JSON.stringify传入了多个独立参数,只会序列化第一个username字段,后端会缺失email、password、base_city、about_me字段,需要修改为传入完整对象:
body: JSON.stringify({username, email, password, base_city, about_me})
可选优化:使用marshmallow做入参校验
你已经定义了RegisterSchema,可以直接用它做入参数校验和序列化,避免手动取字段遗漏的问题:
@app.route("/register", methods=['POST']) def register(): # 校验并反序列化入参 data = register_schema.load(request.json) # 密码加密 data['password'] = bcrypt.generate_password_hash(data['password']) # 直接用解包的方式创建用户实例 user = User(**data) db.session.add(user) db.session.commit() return register_schema.dump(user), 201
内容的提问来源于stack exchange,提问作者filifunk
相关产品推荐
相关产品推荐

