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

得到

以未加密的形式将数据发送到服务器。最常用的方法。

2

与 GET 相同,但没有响应正文。

3

邮政

用于将 HTML 表单数据发送到服务器。服务器不会缓存 POST 方法接收的数据。

4

将目标资源的所有当前表示替换为上传的内容。

5

删除

删除 URL 给出的目标资源的所有当前表示形式。

函数定义中的async关键字告诉 FastAPI 它将异步运行,即不会阻塞当前执行线程。但是,也可以在没有 async 前缀的情况下定义路径操作函数。

此修饰函数返回 JSON 响应。虽然它可以返回几乎任何Python的对象,但它会自动转换为JSON。在本教程中,我们将进一步了解此类函数如何返回Pydantic模型对象。

URL 的端点或路径可以具有一个或多个可变参数。可以使用 Python 的字符串格式化表示法来接受它们。在上面的示例 URL http://localhost:8000/hello/TutorialsPoint 中,最后一个值可能会在每个客户端请求中更改。该可变参数可以在路径中定义的变量中接受,并传递给绑定到操作装饰器的函数中定义的形式参数。

例子

在路由中添加另一个带有可变参数的路径装饰器,并绑定hello()函数以具有名称参数。按照以下内容修改 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 文档

现在,如果我们通过输入 URL http://localhost:8000/docs 来检查 OpenAPI 文档,它将显示两条路由及其各自的视图函数。单击 /hello/{name} 按钮下方的“尝试”按钮,并将 Tutorialspoint 作为 name 参数描述的值,然后单击“执行”按钮。

FastAPI 路径参数

然后它将显示Curl命令、请求 URL以及服务器响应的详细信息(包括响应正文和响应标头)。

FastAPI 路径参数

一条路由可以有多个参数,用“/”符号分隔。

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"
      }
   ]
}

原因很明显,因为年龄是整数,不能接受字符串值。这也将反映在 Swagger UI (OpenAPI) 文档中。

FastAPI 路径参数