pip
安装 FastAPI首先,我们来安装 FastAPI。由于 FastAPI 本身依赖于 Python 的一些库,最简单的安装方法就是通过 pip
来进行安装。在国内,我们可以使用阿里云的 pip
镜像源来加快安装速度。执行以下命令来安装 FastAPI:
pip install fastapi -i https://mirrors.aliyun.com/pypi/simple
FastAPI 是一个用于构建现代 Web APIs 的快速 Python Web 框架,基于 Python 3.7+ 及以上版本,同时利用了 Python 类型提示的特性,使其在编写代码时既直观又高效。
由于 FastAPI 是基于 ASGI(Asynchronous Server Gateway Interface)的异步框架,Uvicorn 是目前最流行的 ASGI 服务器之一,能够为 FastAPI 提供高效的异步支持。因此,我们还需要安装 uvicorn
来启动 FastAPI 应用:
pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple
安装完毕后,我们可以通过创建一个简单的 FastAPI 应用来验证安装是否成功。
为了验证安装的成功与否,我们可以创建一个简单的 FastAPI 应用。首先,创建一个名为 main.py
的 Python 文件,内容如下:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
在这个简单的应用中,我们定义了一个根路径 /
,当用户访问该路径时,FastAPI 会返回一个 JSON
响应:{"message": "Hello World"}
。
要运行这个 FastAPI 应用,我们需要使用 uvicorn
。通过以下命令启动:
uvicorn main:app --reload
此命令的含义如下:
main
:表示 main.py
文件,也就是我们创建的 Python 模块。app
:表示我们在 main.py
文件中定义的 FastAPI 实例对象 app
。--reload
:表示在代码更新时,服务器会自动重新加载。这个选项通常用于开发阶段,使得我们在更改代码后不必手动重启服务器。如果安装和启动都正确,我们会看到如下输出:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [8438] using statreload
INFO: Started server process [8440]
INFO: Waiting for application startup.
INFO: Application startup complete.
现在,打开浏览器,访问 http://127.0.0.1:8000
,我们应该会看到如下的 JSON
响应:
{"message": "Hello World"}
这说明 FastAPI 和 Uvicorn 已成功安装并运行。
FastAPI 的一大特色是自动生成交互式 API 文档。默认情况下,当启动 FastAPI 应用时,它会自动生成一套 Swagger 风格的 API 文档,并集成在 /docs
路径下。
在浏览器中跳转到 http://127.0.0.1:8000/docs
,我们可以看到 FastAPI 自动生成的交互式文档界面。这是基于 Swagger UI 的 API 文档,开发者可以通过该文档直接测试 API 接口,极大地提升了开发效率。
这个文档可以自动更新,如果我们修改或添加新的 API 路由,文档也会随之更新。
此外,FastAPI 还生成了另一个基于 ReDoc 的文档界面,可以通过 http://127.0.0.1:8000/redoc
访问。ReDoc 是另一种风格的 API 文档,适合更多层次的需求。
FastAPI 非常灵活,支持通过路径参数和查询参数来接收请求数据。
路径参数是通过 URL 路径传递的参数。例如,在以下示例中,我们通过 {item_id}
来声明路径参数:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str):
return {"item_id": item_id}
当用户访问 /items/foo
时,FastAPI 会自动将路径中的 foo
传递给 item_id
参数,返回的结果为:
{"item_id": "foo"}
除了路径参数,FastAPI 还支持查询参数。查询参数通常通过 URL 的 ?
符号后跟参数名称传递。例如,以下代码声明了一个可选的查询参数 q
:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Union[str, None] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
在这个例子中,q
是一个可选的查询参数。如果用户在访问 /items/foo?q=bar
,服务器返回的响应将包含 q
参数的值:
{"item_id": "foo", "q": "bar"}
如果不传递查询参数,则返回的结果不包含 q
:
{"item_id": "foo"}
FastAPI 能够自动地将查询参数转换为指定的类型。例如,如果我们声明一个布尔类型的查询参数,FastAPI 会将传入的参数值自动转换为布尔值:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Union[str, None] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update({"description": "This is an amazing item with a long description"})
return item
在这个例子中,short
参数是一个布尔类型。如果我们访问 http://127.0.0.1:8000/items/foo?short=1
或 http://127.0.0.1:8000/items/foo?short=true
,FastAPI 会自动将 short
的值转换为 True
,返回的响应将不包含 description
字段。而如果不传递 short
或传递 short=false
,返回的响应将包含完整描述。
FastAPI 支持多种布尔值的变体,如 1
, True
, on
, yes
等,它们都可以被识别为 True
,而 0
, False
, off
, no
则被识别为 False
。
FastAPI 允许对查询参数进行额外的校验,例如限制参数的最大长度、最小长度或添加正则表达式校验。
在以下示例中,我们使用 Query
函数来添加对 q
参数的额外校验,要求 q
的最大长度为 50 个字符:
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
在这个例子中,如果用户提供的查询参数 q
超过 50 个字符,FastAPI 将自动返回一个错误响应,提示用户输入的内容不符合要求。
本文详细介绍了如何安装和验证 FastAPI,同时介绍了 FastAPI 的基本使用方法,包括路径参数、查询参数、类型转换和参数校验等内容。通过这些基础知识,开发者可以快速构建高效、现代的 Web API。此外,FastAPI 还提供了自动生成的交互式文档,大大提高了开发体验。
FastAPI 的亮点不仅在于性能和简洁性,它还利用了 Python 的类型提示特性,使代码更加可读、易于维护。通过集成 ASGI 服务器(如 Uvicorn),FastAPI 可以处理高并发请求,适用于构建现代化的异步 Web 应用。
随着 Fast
API 社区的不断发展,它已经成为了构建现代 Web API 的一大利器。