python - 如何装饰一个类,以便我能够在运行时更改类的属性
问题描述
def decorator(cls):
#code
return cls
@decorator
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20),nullable=False)
ssid = db.Column(db.String(20))
def __repr__(self):
return f"User('{self.username}',{self.password})"
我想装饰一个类,这样我就可以在装饰器函数中访问 ssid 的值并向该类添加一个新属性。因为新属性需要 ssid 的值。
user = User(username='prince',ssid='9734ait')
db.session.add(user)
解决方案
在评论中,您说实际目标是在进出课堂时加密密码。Sqlalchemy 使用混合属性提供此功能。这是我的一个项目中的一个例子-
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True)
username = Column(String(255))
hashed_password = Column("password", String(255))
@hybrid_property
def password(self):
return self.hashed_password
@password.setter # type: ignore
def password(self, value):
rounds = 4
if not isinstance(value, bytes):
value = value.encode("utf-8")
self.hashed_password = hashpw(value, gensalt(rounds)).decode("utf-8")
(所以在这种情况下,只有散列的密码存储在数据库中——为了检查密码,你对输入进行散列并将其与 user.password 进行比较)
推荐阅读
- git - 如何在 git-p4 中删除未搁置的分支
- powershell - 从另一个域中获取在一个域中创建的组,彼此之间具有信任关系
- angular - 使用 [isAnimated] 时会产生错误
- google-cloud-platform - 新表和现有表之间的 BigQuery 数据复制
- python - Kafka消费者配置差异
- javascript - MongoDb 为什么数据没有存储在数据库中?
- java - 如何使用 RESTful 端点将 jBPM 工作流与 Spring Boot 集成?
- excel - 我正在尝试将 4 个数据透视表的行标签一个接一个地复制到不同的工作表
- c++ - 当我用我的套接字代码发送第二条消息时,我有一个“sendto() 无效参数”
- c# - Acumatica - FieldUpdated - 勾选/取消勾选复选框时启用/禁用另一个控件