Fastapi 简明教程
FastAPI - Path Parameters
现代 Web 框架使用路由或端点作为 URL 的一部分,而不是基于文件的 URL。这有助于用户更有效地记住应用程序 URL。在 FastAPI 中,我们称之为路径。路径或路由是第一个“/”之后紧跟的 URL 部分。
例如,在以下 URL 中,
http://localhost: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 动词可用作操作。
Sr.No. |
Method & Description |
1 |
GET 以未加密形式向服务器发送数据。最常见的方法。 |
2 |
HEAD 与 GET 相同,但没有响应主体。 |
3 |
POST 用于向服务器发送 HTML 表单数据。POST 方法收到的数据不会被服务器缓存。 |
4 |
PUT 用上传的内容替换目标资源的所有当前表示形式。 |
5 |
DELETE 删除某个 URL 给出的目标资源的所有当前表示形式。 |
函数定义中的 async 关键字告诉 FastAPI 它应异步运行,即不阻塞当前执行线程。但是,也可以不带 async 前缀定义路径操作函数。
此装饰器函数返回 JSON 响应。虽然它可以返回 Python 的几乎任何对象,但它会自动转换为 JSON。在本教程后面,我们将看到此类函数如何返回 Pydantic 模型对象。
URL 的端点或路径可以有一个或多个可变参数。可以使用 Python 的字符串格式化符号接受它们。在上述 URL 示例 [role="bare"] [role="bare"]http://localhost:8000/hello/TutorialsPoint 中,最后一个值可能在每个客户端请求中更改。此可变参数可以被接受到路径中定义的变量中,并传递给绑定到操作装饰器的函数中定义的形式参数。
Example
在路由中添加另一个具有可变参数的路径装饰器,并将 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 服务器并访问 [role="bare"] [role="bare"]http://localhost:8000/hello/Tutorialspoint URL。浏览器会显示以下 JSON 响应。
{"name":"Tutorialspoint"}
将可变路径参数更改为其他内容,例如 [role="bare"] [role="bare"]http://localhost:8000/hello/Python ,以便浏览器显示 −
{"name":"Python"}
Check OpenAPI docs
现在,如果我们通过输入 URL 为 [role="bare"] [role="bare"]http://localhost:8000/docs 来检查 OpenAPI 文档,它将显示两个路由及其各自的视图函数。单击 /hello/{name} 按钮下方的尝试按钮,并将 Tutorialspoint 作为 name 参数说明的值,然后单击执行按钮。
然后,它将显示 Curl 命令、 request URL 以及服务器响应的详细信息,包括响应主体和响应头。
一条路由可以有多个由“/”符号分隔的参数。
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello/{name}/{age}")
async def hello(name,age):
return {"name": name, "age":age}
在这种情况下, /hello 是路由,后面跟两个用花括号括起来的参数。如果浏览器地址栏中给出的 URL 为 [role="bare"] [role="bare"]http://localhost:8000/hello/Ravi/20 ,则 Ravi 和 20 的数据将分别分配给变量 name 和 age。浏览器显示以下 JSON 响应 −
{"name":"Ravi","age":"20"}
Path Parameters with Types
可以对要装饰的函数的参数使用 Python 的类型提示。在这种情况下,将 name 定义为 str,将 age 定义为 int。
@app.get("/hello/{name}/{age}")
async def hello(name:str,age:int):
return {"name": name, "age":age}
如果类型不匹配,这将导致浏览器在 JSON 响应中显示 HTTP 错误消息。尝试将 [role="bare"] [role="bare"]http://localhost:8000/hello/20/Ravi 作为 URL 输入。浏览器的响应如下 −
{
"detail": [
{
"loc": [
"path",
"age"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
原因很明显,因为 age 为整数,不能接受字符串值。这也将在 Swagger UI(OpenAPI)文档中反映出来。