FastAPI学习笔记1
FastAPI是一个基于Python的高性能Web框架,专门用于快速构建API接口服务
特点:
异步高性能 开发效率高 自动生成文档
同步

异步

项目创建:
选择好FastAPI项目,填写好项目名称,位置,选择好python项目原生虚拟环境点击创建即可

main函数:
from fastapi import FastAPI
# 创建FastAPI实例
app = FastAPI()
@app.get("/") # 根路径
async def root(): # async是异步的意思,用async修饰过的函数是异步函数
return {"message": "Hello World"}
@app.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello {name}"}
创建虚拟环境小知识点:
在我们没有选择框架来编写python程序的时候可以通过以下步骤来创建虚拟环境

项目运行:
方法一:在项目地址终端中输入uvicorn main:app --reload命令
--reload: 更新代码后保存即可不需要重启项目即可生效

方法二:直接点击右上角运行按钮,该方法也相当于加了--reload

交互式文档: 可能需要开梯子才能访问

路由:
FastAPI的路由定义基于Python的装饰器模式

参数分类:

路径参数:
注意: 路径参数{id}需要与函数中的参数id同名
@app.get("/book/{id}")
async def get_book(id: int):
return {"id":id,"title":f"这是第{id}本书"}
Path函数:
| 参数名 | 类型 | 描述 |
|---|---|---|
default | Any | 参数的默认值。对于路径参数来说通常不设置(因为路径参数总是必需的),但如果设置则会使参数变为可选(一般不推荐用于路径参数)。 |
title | str | 参数的标题,用于生成 OpenAPI 文档中的显示名称。 |
description | str | 参数的详细描述,支持 Markdown 语法,会显示在文档中。 |
gt | float / int | 数值参数必须大于指定的值(greater than)。 |
ge | float / int | 数值参数必须大于等于指定的值(greater than or equal)。 |
lt | float / int | 数值参数必须小于指定的值(less than)。 |
le | float / int | 数值参数必须小于等于指定的值(less than or equal)。 |
min_length | int | 字符串参数的最小长度。 |
max_length | int | 字符串参数的最大长度。 |
regex | str | 字符串参数必须匹配的正则表达式(在 OpenAPI 3.1.0 中可以使用 pattern 别名)。 |
deprecated | bool | 标记该参数是否已弃用,若为 True 则在文档中显示为弃用状态。 |
include_in_schema | bool | 是否将该参数包含在 OpenAPI 模式中(默认为 True)。 |
example | Any | 参数的示例值,用于文档生成。 |
examples | Dict[str, Example] | 多个示例值(OpenAPI 3.1+ 支持),可提供不同场景的示例。 |
alias | str | 参数在 URL 中的实际名称(例如,当 Python 变量名不能直接用作 URL 参数名时使用)。 |
validation_alias | str | 仅用于 Pydantic v2 中,指定验证时使用的别名。 |
serialization_alias | str | 仅用于 Pydantic v2 中,指定序列化时使用的别名。 |
from fastapi import FastAPI, Path
@app.get("/book/{id}")
async def get_book(id: int = Path(..., gt=0, lt=101, description="书籍id,取值范围1-100")):
return {"id":id,"title":f"这是第{id}本书"}
查询参数:
声明的参数不是路径参数时,路径操作函数会把该参数自动解释为查询参数
-
查询参数允许设置默认值,例如limit: int=10
-
查询参数出现在?后面

Qurey函数:
| 参数名 | 类型 | 描述 |
|---|---|---|
default | Any | 参数的默认值。如果未提供该查询参数,则使用此默认值。使用 ... 表示该参数是必需的。 |
title | str | 参数的标题,用于生成 OpenAPI 文档中的显示名称。 |
description | str | 参数的详细描述,支持 Markdown 语法,会显示在文档中。 |
gt | float / int | 数值参数必须大于指定的值(greater than)。 |
ge | float / int | 数值参数必须大于等于指定的值(greater than or equal)。 |
lt | float / int | 数值参数必须小于指定的值(less than)。 |
le | float / int | 数值参数必须小于等于指定的值(less than or equal)。 |
min_length | int | 字符串参数的最小长度。 |
max_length | int | 字符串参数的最大长度。 |
regex | str | 字符串参数必须匹配的正则表达式(在 OpenAPI 3.1.0 中可以使用 pattern 别名)。 |
alias | str | 参数在 URL 中的实际名称(例如,当 Python 变量名不能直接用作查询参数名时使用)。 |
deprecated | bool | 标记该参数是否已弃用,若为 True 则在文档中显示为弃用状态。 |
include_in_schema | bool | 是否将该参数包含在 OpenAPI 模式中(默认为 True)。 |
example | Any | 参数的示例值,用于文档生成。 |
examples | Dict[str, Example] | 多个示例值(OpenAPI 3.1+ 支持),可提供不同场景的示例。 |
validation_alias | str | 仅用于 Pydantic v2 中,指定验证时使用的别名。 |
serialization_alias | str | 仅用于 Pydantic v2 中,指定序列化时使用的别名。 |
from fastapi import FastAPI, Query
@app.get("/news/news_list")
async def get_news_list(
skip: int = Query(0, description="跳过的记录数", lt=100),
limit:int = Query(10, description="返回的记录数")
):
return {"skip": skip, "limit": limit}
请求体参数:
请求体参数不在url里面,而是在消息体中


Field函数:
| 参数名 | 类型 | 描述 |
|---|---|---|
default | Any | 字段的默认值。如果字段不是必填项,可以设置此值。使用 ... 或 Field(...) 表示该字段是必需的。 |
default_factory | Callable | 一个可调用的函数,用于生成复杂的默认值(如一个空的列表或字典)。 |
title | str | 字段的标题,用于生成 OpenAPI 文档中的显示名称。如果未提供,默认使用字段名。 |
description | str | 字段的详细描述,支持 Markdown 语法,会显示在生成的 API 文档中。 |
alias | str | 字段的别名。在请求体中,将使用此别名来提取数据,这在 Python 变量名与 API 字段名不一致时非常有用。 |
gt | float / int | 数值字段必须大于指定的值(greater than)。 |
ge | float / int | 数值字段必须大于等于指定的值(greater than or equal)。 |
lt | float / int | 数值字段必须小于指定的值(less than)。 |
le | float / int | 数值字段必须小于等于指定的值(less than or equal)。 |
min_length | int | 字符串字段的最小长度。 |
max_length | int | 字符串字段的最大长度。 |
pattern | str | 字符串字段必须匹配的正则表达式。在 Pydantic v2 和 FastAPI 0.100.0+ 中推荐使用,替代 regex。 |
regex | str | (已弃用)字符串字段必须匹配的正则表达式。请使用 pattern 代替。 |
multiple_of | float / int | 数值字段必须是某个值的倍数。 |
max_digits | int | Decimal 类型字段允许的最大数字位数(包括整数位和小数位)。 |
decimal_places | int | Decimal 类型字段允许的最大小数位数。 |
examples | list[Any] 或 dict | 字段的示例值,用于 API 文档。在 OpenAPI 3.1+ 中推荐使用。 |
example | Any | (已弃用)字段的单个示例值。建议使用 examples。 |
deprecated | bool | 标记该字段是否已弃用,若为 True 则在生成的文档中显示为弃用状态。 |
include_in_schema | bool | 是否将该字段包含在 JSON Schema 和 OpenAPI 文档中,默认为 True。 |
json_schema_extra | dict | 用于向字段的 JSON Schema 中添加额外的自定义信息。 |
from pydantic import BaseModel, Field
class User(BaseModel):
password: str
Username: str = Field(default="张三", min_length=2, max_length=10)
响应类型
FastAPI有多种响应类型,默认情况下,FastAPI 会自动将路径操作函数返回的 Python 对象(字典、列表、Pydantic 模型等),经由 jsonable_encoder 转换为 JSON 兼容格式,并包装为 JSONResponse 返回。这省去了手动序列化的步骤,让开发者能更专注于业务逻辑。
如果需要返回非 JSON 数据(如 HTML、文件流),FastAPI 提供了丰富的响应类型来返回不同数据。
| 响应类型 | 用途 | 示例 |
|---|---|---|
| JSONResponse | 默认响应,返回JSON数据 | return {"key": "value"} |
| HTMLResponse | 返回HTML内容 | return HTMLResponse(html_content) |
| PlainTextResponse | 返回纯文本 | return PlainTextResponse("text") |
| FileResponse | 返回文件下载 | return FileResponse(path) |
| StreamingResponse | 流式响应 | 生成器函数返回数据 |
| RedirectResponse | 重定向 | return RedirectResponse(url) |
响应类型设置方式
装饰器中指定响应类:
场景:固定返回类型(HTML、纯文本等)
# 通过response_class固定返回类型后该接口就只能返回html的类型
from fastapi.responses import HTMLResponse
@app.get("/html", response_class=HTMLResponse)
async def get_html():
return"<h1>这是标题</h1>"
返回响应对象: 场景:文件下载、图片、流式响应
from fastapi.responses import FileResponse
@app.get("/file")
async def get_file():
file_path = "./files/1.jpeg'
return FileResponse(file_path) # 通过FileResponse()响应对象返回内容
FileResponse 是FastAPI提供的专门用于高效返回文件内容(如图片、PDF、Excel、音视频等)的响应类。它能够智能处理文件路径、媒体类型推断、范围请求和缓存头部,是服务静态文件的推荐方式。
自定义响应数据格式: response_model 是路径操作装饰器(如 @app.get或@app.post) 的关键参数,它通过一个Pydantic模型来严格定义和约束APl端点的输出格式。这一机制在提供自动数据验证和序列化的同时,更是保障数据安全性的第一道防线。
注意: 定义了response_model后接口的返回类型必须和类(News)中的参数一摸一样,不能多或者缺少否则会报错
from pydantic import BaseModel
class News (BaseModel):
id: int
title: str
content: str
@app.get("/news/{id}", response_model=News)
async def get_news(id: int):
return {
"id": id,
"title": f"这是第{id}本书",
"content": "这是一本好书"
}
异常响应处理
对于客户端引发的错误(4xx,如资源未找到、认证失败),应使用fastapi.HTTPException来中断正常处理流程,并返回标准错误响应
from fastapi import HTTPException
@app.get("/news/{id}")
async def get_news(id: int):
id_list = [1, 2, 3, 4, 5, 6]
if id not in id_list:
raise HTTPException(status_code=404, detail="您查找的新闻不存在")
HTTP 状态码分为五大类 ,以百位数区分:
| 分类 | 范围 | 含义 | 常见代码举例 |
|---|---|---|---|
| 1xx | 100–199 | 信息性响应 | 100 Continue(继续) |
| 2xx | 200–299 | 成功 | 200 OK(请求成功)、201 Created(资源已创建)、204 No Content(无返回内容) |
| 3xx | 300–399 | 重定向 | 301 Moved Permanently(永久移动)、302 Found(临时重定向)、304 Not Modified(未修改,可使用缓存) |
| 4xx | 400–499 | 客户端错误 | 400 Bad Request(请求格式错误)、401 Unauthorized(未认证)、403 Forbidden(禁止访问)、404 Not Found(资源不存在)、422 Unprocessable Entity(请求语义错误,如验证失败) |
| 5xx | 500–599 | 服务器错误 | 500 Internal Server Error(服务器内部错误)、502 Bad Gateway(网关错误)、503 Service Unavailable(服务不可用) |
重点说明:
-
422 在 FastAPI 中特别常用,当 Pydantic 模型验证失败时会自动返回 422。
-
401 与 403 的区别:401 表示未提供有效凭证,403 表示已认证但无权限。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)