python - PonyORM - 以编程方式设置字段值
问题描述
我有一个User
具有以下结构的类:
class User(UserMixin, db.Entity):
id = PrimaryKey(int, auto=True)
vorname = Required(str)
nachname = Required(str)
email = Required(str)
password_hash = Required(str)
role = Required(str)
def set_password_hash(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
不幸的是,创建一个然后自动存储在数据库中的用户对象是不可能的,因为我只password
从网络表单中获取原始字段值。
with db_session:
new_user = User(
vorname=form.vorname.data,
nachname=form.nachname.data,
email=form.email.data,
role=form.role.data,
)
new_user.set_password_hash(form.password.data) # this line is not called, since the creation of new_user fails because of the missing password field.
是否可以推迟保存到数据库?或者使用我的自定义函数来设置password_hash
值?
解决方案
我刚刚遇到了类似的事情,也使用了Flask-Login和pony。
你当然可以使用password_hash = Optional(str)
,但如果你不想要这个,你可以考虑覆盖模型__init__
,给它一个简单的密码,然后在传递它之前生成哈希:
def __init__(self, *args, password, **kwargs):
kwargs['password_hash'] = generate_password_hash(password)
super().__init__(*args, **kwargs)
在您的示例中,您可以像这样简单地调用它:
new_user = User(
vorname=form.vorname.data,
nachname=form.nachname.data,
email=form.email.data,
role=form.role.data,
password=form.password.data,
)
推荐阅读
- typescript - 打字稿`Pick`意外地允许任何属性值
- sql - 根据上一个问题的答案选择 MCQ 答案计数
- python - 在虚拟环境中安装相同依赖的两个不同版本
- node.js - 如何让节点在返回文档之前等待?
- git - 我无法推送 GitHub 提交 - RPC 失败;curl 55 发送失败:连接被中止
- python-requests - Python requests_Query_String_Multiple_Values
- google-cloud-platform - 是否为帐户启用了 Google Drive API 仅提供对该驱动器的完全权限?
- autodesk-forge - 使用 SendStringtoExecute 时伪造错误(命令 ^C^C)
- python - 如何在python中每n秒重复x次?
- python - 从列表中的列表中提取列值