hybrid_property 装饰器:无法设置属性错误
The hybrid_property decorator: can't set attribute error
我在 __init__.py
中创建了一个应用,如下所示:
from flask_bcrypt import Bcrypt
app = Flask(__name__, static_folder='static')
bcrypt = Bcrypt(app)
我在创建数据库模型时使用这个 app
实例,如下所示:
from sqlalchemy.ext.hybrid import hybrid_property
from app import bcrypt, db
class User(db.Model):
name = db.Column(db.String, nullable=False)
_password = db.Column(db.String)
@hybrid_property
def password(self) -> str:
return self._password
@password.setter
def _set_password(self, password: str):
self._password = bcrypt.generate_password_hash(password)
然后我尝试按如下方式启动一个实例(这是我想要的方式,因为它看起来更干净):
user = User(name='foo', password='bar')
但是当我将其提交到数据库时出现以下错误:AttributeError:无法设置属性。如果我使用:
user = User(name='foo', _password='bar')
我想我没有正确使用 @hybrid_property
装饰器?如果可能,我想使用 user = User(name='foo', password='bar')
语法。
在此感谢您的帮助。
无论您使用 @hybrid_property
装饰器还是原生 python 对象的 @property
装饰器,您都必须保留在 属性 定义中用于 setter 或getter 方法。
这里的 def _set_password()
应该是 def password()
。您的代码应如下所示:
@hybrid_property
def password(self):
return self._password_hash
@password.setter
def password(self, plaintext):
self._password_hash = generate_password_hash(plaintext)
我在 __init__.py
中创建了一个应用,如下所示:
from flask_bcrypt import Bcrypt
app = Flask(__name__, static_folder='static')
bcrypt = Bcrypt(app)
我在创建数据库模型时使用这个 app
实例,如下所示:
from sqlalchemy.ext.hybrid import hybrid_property
from app import bcrypt, db
class User(db.Model):
name = db.Column(db.String, nullable=False)
_password = db.Column(db.String)
@hybrid_property
def password(self) -> str:
return self._password
@password.setter
def _set_password(self, password: str):
self._password = bcrypt.generate_password_hash(password)
然后我尝试按如下方式启动一个实例(这是我想要的方式,因为它看起来更干净):
user = User(name='foo', password='bar')
但是当我将其提交到数据库时出现以下错误:AttributeError:无法设置属性。如果我使用:
user = User(name='foo', _password='bar')
我想我没有正确使用 @hybrid_property
装饰器?如果可能,我想使用 user = User(name='foo', password='bar')
语法。
在此感谢您的帮助。
无论您使用 @hybrid_property
装饰器还是原生 python 对象的 @property
装饰器,您都必须保留在 属性 定义中用于 setter 或getter 方法。
这里的 def _set_password()
应该是 def password()
。您的代码应如下所示:
@hybrid_property
def password(self):
return self._password_hash
@password.setter
def password(self, plaintext):
self._password_hash = generate_password_hash(plaintext)