FastAPI - 路径参数
现代 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 动词都可以用作操作。
序号 | 方法 & 描述 |
---|---|
1 | GET 以未加密的形式将数据发送到服务器。 最常用的方法。 |
2 | HEAD 与 GET 相同,但没有响应主体。 |
3 | POST 用于向服务器发送 HTML 表单数据。 POST 方法接收到的数据不会被服务器缓存。 |
4 | PUT 将目标资源的当前表示替换为上传的内容。 |
5 | DELETE 删除 URL 给定的目标资源的所有当前表示。 |
函数定义中的 async 关键字告诉 FastAPI 它将异步运行,即不阻塞当前执行线程。 但是,路径操作函数也可以在没有 async 前缀的情况下定义。
这个装饰函数返回一个 JSON 响应。 虽然它几乎可以返回任何 Python 的对象,但它会自动转换为 JSON。 在本教程的后续部分,我们将看到这样一个函数如何返回 Pydantic 模型对象。
URL 的端点或路径可以有一个或多个可变参数。 可以使用 Python 的字符串格式化符号来接受它们。 在上面的示例 URL http://localhost: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 服务器并访问 http://localhost:8000/hello/Tutorialspoint URL。 浏览器显示以下 JSON 响应。
{"name":"Tutorialspoint"}
将变量路径参数更改为其他内容,例如 http://localhost:8000/hello/Python,以便浏览器显示 −
{"name":"Python"}
查看 OpenAPI 文档
现在,如果我们通过输入 http://localhost:8000/docs 这样的 URL 来查看 OpenAPI 文档,它将显示两个路由及其各自的视图函数。 单击 /hello/{name} 按钮下方的 try 按钮,将 Tutorialspoint 作为名称参数描述的值,然后单击执行按钮。
然后它将显示 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是http://localhost: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 错误消息。 尝试输入 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) 文档中。