Skip to content

Commit 7e19002

Browse files
committed
Restore compatiblity with Python 3.9
1 parent 10f57cf commit 7e19002

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

chapters/8-auth.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ False
2525
我们在存储用户信息的 `User` 模型类添加 `username` 字段和 `password_hash` 字段,分别用来存储登录所需的用户名和密码散列值,同时添加两个方法来实现设置密码和验证密码的功能:
2626

2727
```python
28+
from typing import Optional
29+
2830
from sqlalchemy import String
2931
from sqlalchemy.orm import Mapped, mapped_column
3032
from 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):
5672
user = User(name=name, username='admin')
5773
user.set_password('helloflask')
5874
```
75+
5976
## 生成管理员账户
6077

6178
因为程序只允许一个人使用,没有必要编写一个注册页面。我们可以编写一个命令来创建管理员账户,下面是实现这个功能的 `admin()` 函数:

0 commit comments

Comments
 (0)