Python Flask sqlalchemy:无法将属性字段作为关键字参数提供给构造函数
我正在阅读《Flask Web开发》一书,并创建了一个与flasky()类似的应用程序。我已经建立了一个用户模型:Python Flask sqlalchemy:无法将属性字段作为关键字参数提供给构造函数,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我正在阅读《Flask Web开发》一书,并创建了一个与flasky()类似的应用程序。我已经建立了一个用户模型: from flask_login import UserMixin from werkzeug.security import check_password_hash, generate_password_hash from app import db class User(UserMixin, db.Model): id = db.Column(db.Integer
from flask_login import UserMixin
from werkzeug.security import check_password_hash, generate_password_hash
from app import db
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
password_hash = db.Column(db.String)
@property
def password(self):
raise AttributeError('password is read-only')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return verify_password_hash(self.password_hash, password)
def __init__(self, username, email):
self.username = username
self.email = email
现在在注册视图中,我执行以下操作:
user = User(email=form.email.data, username=form.username.data,
password = form.password.data)
我得到以下错误:
TypeError: __init__() got an unexpected keyword argument 'password'
奇怪的是,教程项目也是这样做的,见第54行
当我这样做时,它会起作用:
user = User(email=form.email.data, username=form.username.data)
user.password = form.password.data
但是我希望能够将密码传递给构造函数。显然,Alchemy不理解密码是一个属性。但在教程中,这是如何工作的呢?我找不到差异。您覆盖了
\uuuu init\uuuu
,但不允许输入密码:
def __init__(self, username, email):
self.username = username
self.email = email
无需重写\uuuuu init\uuuuu
,因为默认的SQLAlchemy模型提供了一个已经接受所有字段的模型。只需删除\uuuu init\uuuu
声明,事情就应该正常运行了
在这个例子中,Michael确实重写了
\uuuuu init\uuuuuu
方法,但他接受所有关键字参数,他做的第一件事就是将它们转发给超级构造函数(以保留SQLAlchemy的默认行为)。Wow。。我现在感到惭愧。。真不敢相信我错过了:(谢谢!