接下来几篇文章将介绍FastAPI如何管理传入的请求体和传出的响应,并提供对应的示例代码。
客户端可以通过路径参数(path parameters)、查询参数(query parameters)或头部(headers)将请求数据传递给 FastAPI 端点URL,以执行服务中的代码逻辑。根据API 服务的逻辑,我们使用这些参数来影响和构建客户端需要的必要响应。
一、路径参数(path parameters)
FastAPI允许通过路径参数或路径变量从API的端点URL获取请求数据,这使得URL具有一定的动态性。
此参数包含一个值,该值成为由花括号{}表示的URL的一部分。在URL中设置这些路径参数后,FastAPI要求通过应用类型提示声明这些参数。
例如下面的 delete_user() 服务使用用户名(username)路径参数,通过该参数搜索要删除的用户记录。
@app.delete("/ch01/login/remove/{username}")
def delete_user(username: str):
if username is None:
return {"message": "无效用户"}
else:
del valid_users[username]
return {"message": "用户已删除"}
所有请求参数都必须在应用 PEP 484 标准的服务方法的方法签名中声明类型,称为类型提示。FastAPI 支持常见的类型,如 None、bool、int 和 float,以及容器类型,如 list、tuple、dict、set、frozenset 和 deque。还支持其他复杂的Python 类型,如 datetime.date、datetime.time、datetime.datetime、datetime.delta、UUID、bytes 和 Decimal。
该框架还支持 Python 类型模块(typing module)中包含的数据类型,负责类型提示。这些数据类型是 Python 的标准表示法,是变量类型注释,有助于在编译期间进行类型检查和模型验证,例如 Optional、List、Dict、Set、Union、Tuple、FrozenSet、Iterable 和 Deque。
二、多路径参数(multiple path parameters)
如果最左侧的变量比最右侧的变量更有可能填充值,则可以接受多个路径参数(multiple path parameters)。换句话说,最左侧路径变量比右侧的更重要。此标准用于确保端点 URL 不会看起来像其他 URL,这可能导致一些冲突和混淆。以下login_with_token() 服务遵循此标准,因为用户名是主键,比下一个参数 password 更重要。
@app.get("/ch01/login/{username}/{password}")
def login_with_token(username: str, password: str, id:UUID):
if valid_users.get(username) is None:
return {"message": "用户不存在"}
else:
user = valid_users[username]
if user.id == id and checkpw(password.encode(), user.passphrase.encode()):
return user
else:
return {"message": "无效用户"}
当上述动态URL模式和一个固定 URL 匹配时,并且固定URL的服务在动态 URL之后实现,会出现问题。如下是一段示例代码:
@app.get("/ch01/login/details/info")
def login_info():
return {"message": "username and password are needed"}
当访问URL:localhost:8000/ch01/login/details/info 时,会返回 HTTP 状态码 422(Unprocessable Entity)。
在这种情况下,固定路径的details和info路径目录被分别作为用户名和密码参数值处理。 由于混淆,FastAPI的内置数据验证将向我们显示一个JSON格式的错误消息,"msg" 为“field required”,“type”为“value_error.missing”。
为了解决这个问题,所有固定路径都应该在带有路径参数的动态端点URL之前声明。 因此,前面的login_info() 服务应该在login_with_token()之前声明。
本文暂时没有评论,来添加一个吧(●'◡'●)