Working with Passwords
这是一个常见的用例,您有一个包含密码字段的模型,并且该字段需要自定义行为。
假设您有以下的 User 模型:
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(50))
hashed_password: Mapped[str] = mapped_column(String)在这个特定的用例中,我们希望在管理员界面中实现以下功能:
在创建新用户时只显示
hashed_password字段,在编辑用户时隐藏该字段。当创建用户时,密码应被哈希并存储在
hashed_password列中。
因此,我们为此定义以下 UserAdmin 类:
class UserAdmin(ModelView, model=User):
column_labels = {"hashed_password": "password"}
form_create_rules = ["name", "hashed_password"]
form_edit_rules = ["name"]
async def on_model_change(self, data, model, is_created, request) -> None:
if is_created:
# 在保存到数据库之前对密码进行哈希处理!
data["hashed_password"] = data["hashed_password"] + "_hashed"让我们看看发生了什么。
column_labels只是告诉我们在显示或创建User表单时将hashed_password重命名为password。接下来,我们定义了两个额外的属性:
form_create_rules和form_edit_rules,它们控制如何创建创建和编辑表单。
在 form_create_rules 中,我们指定在创建 User 时要包含 name 和 hashed_password 字段。
但在 form_edit_rules 中,我们专门排除了 hashed_password,因此我们只希望在编辑用户时修改 name 字段。
最后一步是在保存密码到数据库之前对其进行哈希处理。我们可以有几种方法来实现这一点,但在这个例子中,我们重写了 on_model_change 方法,只在创建用户时进行密码哈希处理。
最后更新于