有时,我们需要为某些 API 服务的查询参数和路径参数指定默认值,以避免验证错误消息,例如 field required 和 value_error.missing。为参数设置默认值将允许在提供参数值或不提供参数值的情况下执行 API 方法。
根据要求,分配的默认值通常是数字类型的 0,布尔类型的 False,字符串类型的空字符串,列表类型的空列表[],字典类型的空字典{}。
本文将介绍默认参数开发示例,包括delete_pending_users() 和 change_password() 服务。
一、delete_pending_users服务
以下 delete_pending_users() 服务展示了如何将默认值应用于查询参数和路径参数:
@app.delete("/ch01/login/remove/all")
def delete_users(usernames: List[str]):
for user in usernames:
del valid_users[user]
return {"message": "用户已删除"}
这段代码定义了一个 FastAPI 路由处理函数,用于删除多个用户。
List[str] 是类型注解,指明 usernames 应该是一个字符串列表。这是 FastAPI 依赖的 Pydantic 库提供的类型提示,可以自动处理请求数据的验证。
delete_pending_users() 甚至可以在不传递任何accounts参数的情况下执行,因为accounts默认情况下始终为空List。
如果用户名存在于 valid_users 字典中,相应的用户将被删除。如果尝试删除一个不存在的键,Python 将会抛出 KeyError。如果想避免这个异常,需要在尝试删除前检查键是否存在。
二、change_password服务
以下是change_password() 服务的示例底阿妈,其中 old_pwd和 new_pwd 默认参数值为空字符串。
@app.get("/ch01/login/password/change")
def change_password(username: str, old_pwd: str = '', new_pwd: str = ''):
pwd_len = 8
if valid_users.get(username) is None:
return {"message": "用户不存在"}
elif old_pwd == '' or new_pwd == '':
characters = ascii_lowercase
temp_pwd = ''.join(random.choice(characters) for i in range(pwd_len))
user = valid_users.get(username)
user.password = temp_pwd
user.passphrase = hashpw(temp_pwd.encode(), gensalt())
return user
else:
user = valid_users.get(username)
if user.password == old_pwd:
user.password = new_pwd
user.passphrase = hashpw(new_pwd.encode(), gensalt())
return user
else:
return {"message": "无效用户"}
访问该API服务时,不传递任何参数值给 old_pwd 和new_pwd,因为它们都默认为空str。hashpw()是一个bcrypt实用函数,它从自动生成的salt生成散列密码。
上图中,由于old_pwd 和new_pwd都为空字符串,按照代码逻辑,生成随机的password。
下图中,同时传入 old_pwd和new_pwd参数值,更新password为传入的 new_pwd参数值。
本文暂时没有评论,来添加一个吧(●'◡'●)