首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hybrid_property装饰器:无法设置属性错误

hybrid_property装饰器:无法设置属性错误
EN

Stack Overflow用户
提问于 2020-06-07 17:35:01
回答 1查看 561关注 0票数 1

我在__init__.py中创建了一个应用程序如下:

代码语言:javascript
复制
from flask_bcrypt import Bcrypt

app = Flask(__name__, static_folder='static')
bcrypt = Bcrypt(app)

我在创建数据库模型时使用这个app实例,如下所示:

代码语言:javascript
复制
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)

我试图创建一个实例,如下所示(这是我想要做的方法,因为它看起来更干净):

代码语言:javascript
复制
user = User(name='foo', password='bar')

但是,当我将它提交到数据库时,我会得到以下错误:AttributeError:无法设置属性。如果我使用:

代码语言:javascript
复制
user = User(name='foo', _password='bar')

我想我没有正确地使用@hybrid_property装饰器?如果可能的话,我想使用user = User(name='foo', password='bar')语法。

谢谢你的帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-15 10:57:19

无论是使用@hybrid_property装饰器还是使用本机python对象的@property装饰器,都必须保留用于setter或getter方法的属性定义中使用的相同属性名。

在这里,在您的例子中,def _set_password()应该是def password()。您的代码应该如下所示:

代码语言:javascript
复制
 @hybrid_property
 def password(self):
     return self._password_hash

 @password.setter
 def password(self, plaintext):
     self._password_hash = generate_password_hash(plaintext)  

详细说明:https://github.com/sqlalchemy/sqlalchemy/issues/4332

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62249208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档