- FastAPI 教程
- FastAPI - 首页
- FastAPI - 简介
- FastAPI - Hello World
- FastAPI - OpenAPI
- FastAPI - Uvicorn
- FastAPI - 类型提示
- FastAPI - IDE 支持
- FastAPI - REST 架构
- FastAPI - 路径参数
- FastAPI - 查询参数
- FastAPI - 参数验证
- FastAPI - Pydantic
- FastAPI - 请求体
- FastAPI - 模板
- FastAPI - 静态文件
- FastAPI - HTML 表单模板
- FastAPI - 访问表单数据
- FastAPI - 上传文件
- FastAPI - Cookie 参数
- FastAPI - 头部参数
- FastAPI - 响应模型
- FastAPI - 嵌套模型
- FastAPI - 依赖项
- FastAPI - CORS
- FastAPI - CRUD 操作
- FastAPI - SQL 数据库
- FastAPI - 使用 MongoDB
- FastAPI - 使用 GraphQL
- FastAPI - Websockets
- FastAPI - FastAPI 事件处理器
- FastAPI - 挂载子应用
- FastAPI - 中间件
- FastAPI - 挂载 Flask 应用
- FastAPI - 部署
- FastAPI 有用资源
- FastAPI - 快速指南
- FastAPI - 有用资源
- FastAPI - 讨论
FastAPI - 路径参数
现代 Web 框架使用路由或端点作为 URL 的一部分,而不是基于文件的 URL。这有助于用户更有效地记住应用程序 URL。在 FastAPI 中,它被称为路径。路径或路由是 URL 中第一个“/”之后的部分。
例如,在以下 URL 中:
https://127.0.0.1:8000/hello/TutorialsPoint
路径或路由将是
/hello/TutorialsPoint
在 FastAPI 中,这样的路径字符串作为参数传递给操作装饰器。这里的操作指的是浏览器用于发送数据的 HTTP 动词。这些操作包括 GET、PUT 等。操作装饰器(例如,@app.get("/"))紧跟一个函数,当访问指定的 URL 时会执行该函数。在下面的示例中:
from fastapi import FastAPI app = FastAPI() @app.get("/") async def index(): return {"message": "Hello World"}
这里,("/") 是路径,get 是操作,@app.get("/") 是路径操作装饰器,它下面的 index() 函数被称为路径操作函数。
任何以下 HTTP 动词都可以用作操作。
序号 | 方法和描述 |
---|---|
1 | GET 以未加密的形式将数据发送到服务器。最常见的方法。 |
2 | HEAD 与 GET 相同,但没有响应体。 |
3 | POST 用于将 HTML 表单数据发送到服务器。POST 方法接收的数据不会被服务器缓存。 |
4 | PUT 用上传的内容替换目标资源的所有当前表示形式。 |
5 | DELETE 删除 URL 指定的目标资源的所有当前表示形式。 |
函数定义中的async关键字告诉 FastAPI 它应该异步运行,即不阻塞当前执行线程。但是,路径操作函数也可以在没有 async 前缀的情况下定义。
此装饰函数返回 JSON 响应。虽然它可以返回几乎任何 Python 对象,但它会自动转换为 JSON。在本教程的后面,我们将看到这样的函数如何返回Pydantic模型对象。
URL 的端点或路径可以包含一个或多个变量参数。它们可以通过使用 Python 的字符串格式化表示法来接收。在上面的示例 URL https://127.0.0.1:8000/hello/TutorialsPoint 中,最后一个值可能会在每个客户端请求中发生变化。此变量参数可以在路径中定义的变量中接收,并传递给绑定到操作装饰器的函数中定义的形式参数。
示例
添加另一个带有变量参数的路径装饰器,并绑定hello()函数以具有 name 参数。根据以下内容修改 main.py。
import uvicorn from fastapi import FastAPI app = FastAPI() @app.get("/") async def index(): return {"message": "Hello World"} @app.get("/hello/{name}") async def hello(name): return {"name": name}
启动 Uvicorn 服务器并访问 https://127.0.0.1:8000/hello/Tutorialspoint URL。浏览器将显示以下 JSON 响应。
{"name":"Tutorialspoint"}
将变量路径参数更改为其他内容,例如 https://127.0.0.1:8000/hello/Python,以便浏览器显示:
{"name":"Python"}
检查 OpenAPI 文档
现在,如果我们通过输入 URL https://127.0.0.1:8000/docs 检查 OpenAPI 文档,它将显示两条路由及其各自的视图函数。单击 /hello/{name} 按钮下方的“尝试”按钮,并将 Tutorialspoint 作为 name 参数描述的值,然后单击“执行”按钮。
然后,它将显示Curl命令、请求 URL以及服务器响应的详细信息,包括响应体和响应头。
一条路由可以有多个由“/”符号分隔的参数。
from fastapi import FastAPI app = FastAPI() @app.get("/hello/{name}/{age}") async def hello(name,age): return {"name": name, "age":age}
在这种情况下,/hello是路由,后面跟着两个用花括号括起来的参数。如果浏览器地址栏中提供的 URL 为 https://127.0.0.1:8000/hello/Ravi/20,则 Ravi 和 20 的数据将分别分配给变量 name 和 age。浏览器将显示以下 JSON 响应:
{"name":"Ravi","age":"20"}
带类型的路径参数
您可以对要装饰的函数的参数使用 Python 的类型提示。在这种情况下,将 name 定义为 str,将 age 定义为 int。
@app.get("/hello/{name}/{age}") async def hello(name:str,age:int): return {"name": name, "age":age}
如果类型不匹配,这将导致浏览器在 JSON 响应中显示 HTTP 错误消息。尝试输入 https://127.0.0.1:8000/hello/20/Ravi 作为 URL。浏览器的响应将如下所示:
{ "detail": [ { "loc": [ "path", "age" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] }
原因很明显,因为age是整数,不能接受字符串值。这也会反映在 Swagger UI(OpenAPI)文档中。