2525我们在存储用户信息的 ` User ` 模型类添加 ` username ` 字段和 ` password_hash ` 字段,分别用来存储登录所需的用户名和密码散列值,同时添加两个方法来实现设置密码和验证密码的功能:
2626
2727``` python
28+ from typing import Optional
29+
2830from sqlalchemy import String
2931from sqlalchemy.orm import Mapped, mapped_column
3032from werkzeug.security import generate_password_hash, check_password_hash
@@ -35,7 +37,7 @@ class User(db.Model):
3537 id : Mapped[int ] = mapped_column(primary_key = True ) # 主键
3638 name: Mapped[str ] = mapped_column(String(20 )) # 名字
3739 username: Mapped[str ] = mapped_column(String(20 )) # 用户名
38- password_hash: Mapped[str ] = mapped_column(String(128 )) # 密码散列值
40+ password_hash: Mapped[Optional[ str ] ] = mapped_column(String(128 )) # 密码散列值
3941
4042 def set_password (self , password ): # 用来设置密码的方法,接受密码作为参数
4143 self .password_hash = generate_password_hash(password) # 将生成的密码保持到对应字段
@@ -44,6 +46,20 @@ class User(db.Model):
4446 return check_password_hash(self .password_hash, password) # 返回布尔值
4547```
4648
49+ password_hash 字段在调用 set_password() 方法时才会生成,因此我们使用 Optional 将其标记为可选字段:
50+
51+ ``` python
52+ from typing import Optional
53+
54+ password_hash: Mapped[Optional[str ]] = mapped_column(String(128 ))
55+ ```
56+
57+ 如果你使用的 Python 版本是 3.10 及以上版本,可以使用管道符号搭配 None 来表示可选:
58+
59+ ``` python
60+ password_hash: Mapped[str | None ] = mapped_column(String(128 ))
61+ ```
62+
4763因为模型(表结构)发生变化,我们需要重新生成数据库(这会清空数据):
4864
4965``` bash
@@ -56,6 +72,7 @@ class User(db.Model):
5672user = User(name = name, username = ' admin' )
5773user.set_password(' helloflask' )
5874```
75+
5976## 生成管理员账户
6077
6178因为程序只允许一个人使用,没有必要编写一个注册页面。我们可以编写一个命令来创建管理员账户,下面是实现这个功能的 ` admin() ` 函数:
0 commit comments