这个分步指南向你展示如何使用FastAPI编写第一个Restful API: Hello World项目。事不宜迟,我们开始吧。
FastAPI 是什么?
FastAPI 是一个现代、高性能的 Python Web 框架,专为构建 API(应用程序接口)而设计。它结合了以下特点:
速度快:性能接近 Node.js 和 Go(基于 Starlette 和 Pydantic)
- 开发效率高:极简的代码即可实现复杂功能
- 类型提示支持:基于 Python 类型注解(Type Hints)自动验证请求数据
- 自动文档生成:内置 Swagger UI 和生成接口文档
- 异步支持:原生兼容 async/await 语法
核心特性
| 特性 | 说明 |
|---|---|
| 类型驱动开发 | 使用 Python 类型注解定义请求/响应模型,自动验证数据格式 |
| 依赖注入系统 | 灵活管理代码依赖(如数据库连接、认证) |
| OAuth2/JWT 支持 | 内置安全工具,快速实现身份验证和授权 |
| WebSocket 支持 | 轻松处理实时双向通信 |
| OpenAPI 标准 | 自动生成符合 OpenAPI 规范的文档(Swagger UI) |
搭建环境
创建一个新目录来承载示例项目:
mkdir fastapi01
导航到新创建的文件夹,然后通过执行以下命令初始化Python虚拟环境, 然后激活虚拟环境:
Python3 -m venv
source env/bin/activate
安装包
除了FastAPI,我们还需要使用另一个名为uvicorn的包。Uvicorn是一个Python的web服务器实现,它可以帮助我们启动我们的后端,这样它就可以从web浏览器或任何HTTP客户端(Postman, Thunder client等)访问。此外,当我们更改代码时,uvicorn还可以自动重新加载服务器,使我们的工作过程更快,更高效。
在上一步激活的环境中,执行如下命令:
pip install fastapi uvicorn

编写代码
在项目文件夹中,创建一个名为main.py的新文件。项目文件结构现在看起来像这样:
.
├── env
├── __pycache__
└── main.py
main.py代码如下:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello_world():
return {"success": True, "message": "Hello World"}
代码解释:
首先,我们导入FastAPI:
from fastapi import FastAPI
然后我们实例化一个FastAPI对象:
app = FastAPI()
下一行用来定义路由:
@app.get(“/”)
最后但并非最不重要的是当访问路由时将调用的函数:
async def hello_world():
return {"success": True, "message": "Hello World"}
运行测试
运行以下命令启动API:
uvicorn main:app --reload
命令解释如下:
- main:我们的入口文件main.py的名字,不带扩展名.py
- app: main.py中的app对象
- –reload:此标志将帮助我们的服务器在代码更改时自动刷新
现在,您将在终端窗口中看到以下输出:

在浏览器中,访问http://localhost:8000或http://127.0.0.1:8000。你会看到这个:

响应体是JSON格式。
如果你访问了一个不存在的路由,响应将是:
{"detail":"Not Found"}
FastAPI的一个令人敬畏的特性是自动生成的交互式文档。在web浏览器中访问http://localhost:8000/docs,您将看到有关路由的所有信息:

要停止web服务器,只需按Ctrl + C。如果你愿意,你可以添加其他路由:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello_world():
return {"success": True, "message": "Hello World"}
@app.get('/users')
async def get_users():
return {"success": True, "users": ["John", "Jane", "Sling Academy"]}
祝贺!你已经使用FastAPI成功创建了第一个后端API。代码的数量少得惊人。
动态路由
路由是指API的端点(uri)如何响应传入请求。在FastAPI中,路由路径与请求方法结合,定义了可以发出请求的端点。可以定义一个动态路由路径,该路径可以包含一个或多个路径参数(变量)。每个参数将被包装在一对花括号{}中。
让我们看看下面最简单的例子:
from fastapi import FastAPI
app = FastAPI()
@app.get('/users/{user_id}/{user_name}')
async def get_users(user_id: int, user_name: str):
return {"user_data": {
"id": user_id,
"message": "Hello, " + user_name,
}}
路径参数user_id和user_name的值将作为参数user_id和user_name传递给处理程序函数。
如果你运行上面的代码,用浏览器访问http://localhost:8000/users/123/ABCDEF,你会看到:
{"user_data":{"id":123,"message":"Hello, ABCDEF"}}
如果仔细查看代码,你会注意到参数的类型是在函数中声明的,其中user_id是int, user_name是str,这有助于验证传递给URL的值。如果你在地址栏中输入这个URL http://localhost:8000/users/foo/bar,你会得到一个错误:
{"detail":
[{
"loc":["path","user_id"],
"msg":"value is not a valid integer",
"type":"type_error.integer"
}]
}
有关API的详细信息也在http://localhost:8000/docs上自动生成:

这将使使用你的API(面向web前端或移动应用)的开发人员更容易获得必要的见解。
查询参数
查询字符串是URL中问号?后面的部分。它意味着通过URL向服务器发送少量信息。此信息通常用作对数据库中的记录进行分页、筛选和排序的参数。查询参数(或查询参数)是查询字符串中以&字符分隔的键值对。例如,如果我们有一个这样的URL:
http://localhost:8000/items?page=1&limit=10&orderBy=id&order=DESC
然后有4个键值对查询参数:
- page: 值为 1
- limit: 值为 10
- orderBy: 值为 id
- order: 值为 DESC (abbreviation of descending)
在FastAPI中,提取和验证查询参数是简单而直接的。我们要做的是将它们声明为请求处理程序函数的参数。不属于路径参数的参数将被自动解释为queryparameters。
我们将编写代码来获取上面URL中的查询参数:
from fastapi import FastAPI
app = FastAPI()
@app.get('/items')
async def get_items(page: int, limit: int, orderBy: str, order: str):
return {"information": {
"page": page,
"limit": limit,
"orderBy": orderBy,
"order": order
}}
启动FastAPI应用程序,然后打开web浏览器并访问以下URL:
http://localhost:8000/items?page=1&limit=10&orderBy=id&order=DESC
你会得到这个:

还可以为查询参数设置默认值,如下所示:
from fastapi import FastAPI
app = FastAPI()
@app.get('/items')
async def get_items(page: int = 0, limit: int = 10, orderBy: str = 'id', order: str = 'asc'):
return {"information": {
"page": page,
"limit": limit,
"orderBy": orderBy,
"order": order
}}
然后,如果URL中没有显式列出任何参数,则将使用默认值。此外,FastAPI还自动验证参数的类型。另一件值得注意的事情是,用户在没有在path操作函数中声明的情况下任意添加的参数也会被忽略。这增加了应用程序的安全性。
77

被折叠的 条评论
为什么被折叠?



