gpt4 book ai didi

python - Flask-sqlalchemy:无法将属性字段作为关键字参数提供给构造函数

转载 作者:行者123 更新时间:2023-11-30 23:21:54 25 4
gpt4 key购买 nike

我正在阅读“Flask Web 开发”一书,并创建了一个与 Flask 类似的应用程序 ( https://github.com/miguelgrinberg/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, 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

现在在注册 View 中我执行以下操作:

user = User(email=form.email.data, username=form.username.data,
password = form.password.data)

我收到以下错误:

TypeError: __init__() got an unexpected keyword argument 'password'

奇怪的是,教程项目也是如此,请参阅 https://github.com/miguelgrinberg/flasky/blob/master/app/auth/views.py ,第 54 行。

当我这样做时它起作用了:

user = User(email=form.email.data, username=form.username.data)
user.password = form.password.data

但我希望能够将密码传递给构造函数。显然,flask_sqlalchemy 不明白密码是一个属性。但为什么这在教程中有效呢?我找不到区别。

最佳答案

您覆盖了 __init__ 但不允许输入密码:

def __init__(self, username, email):
self.username = username
self.email = email

无需重写__init__,因为默认的 SQLAlchemy 模型已提供接受所有字段的模型。只需删除 __init__ 声明,事情就会正常工作

code from the book Michael 确实重写了 __init__ 方法,但他接受所有关键字参数,并且他做的第一件事是将它们转发到 super 构造函数(以保留 SQLAlchemy 的默认行为。)

关于python - Flask-sqlalchemy:无法将属性字段作为关键字参数提供给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24759845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com