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函数:

参数名类型描述
defaultAny参数的默认值。对于路径参数来说通常不设置(因为路径参数总是必需的),但如果设置则会使参数变为可选(一般不推荐用于路径参数)。
titlestr参数的标题,用于生成 OpenAPI 文档中的显示名称。
descriptionstr参数的详细描述,支持 Markdown 语法,会显示在文档中。
gtfloat / int数值参数必须大于指定的值(greater than)。
gefloat / int数值参数必须大于等于指定的值(greater than or equal)。
ltfloat / int数值参数必须小于指定的值(less than)。
lefloat / int数值参数必须小于等于指定的值(less than or equal)。
min_lengthint字符串参数的最小长度。
max_lengthint字符串参数的最大长度。
regexstr字符串参数必须匹配的正则表达式(在 OpenAPI 3.1.0 中可以使用 pattern 别名)。
deprecatedbool标记该参数是否已弃用,若为 True 则在文档中显示为弃用状态。
include_in_schemabool是否将该参数包含在 OpenAPI 模式中(默认为 True)。
exampleAny参数的示例值,用于文档生成。
examplesDict[str, Example]多个示例值(OpenAPI 3.1+ 支持),可提供不同场景的示例。
aliasstr参数在 URL 中的实际名称(例如,当 Python 变量名不能直接用作 URL 参数名时使用)。
validation_aliasstr仅用于 Pydantic v2 中,指定验证时使用的别名。
serialization_aliasstr仅用于 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}本书"}

查询参数:

声明的参数不是路径参数时,路径操作函数会把该参数自动解释为查询参数

  1. 查询参数允许设置默认值,例如limit: int=10

  2. 查询参数出现在?后面

Qurey函数:

参数名类型描述
defaultAny参数的默认值。如果未提供该查询参数,则使用此默认值。使用 ... 表示该参数是必需的。
titlestr参数的标题,用于生成 OpenAPI 文档中的显示名称。
descriptionstr参数的详细描述,支持 Markdown 语法,会显示在文档中。
gtfloat / int数值参数必须大于指定的值(greater than)。
gefloat / int数值参数必须大于等于指定的值(greater than or equal)。
ltfloat / int数值参数必须小于指定的值(less than)。
lefloat / int数值参数必须小于等于指定的值(less than or equal)。
min_lengthint字符串参数的最小长度。
max_lengthint字符串参数的最大长度。
regexstr字符串参数必须匹配的正则表达式(在 OpenAPI 3.1.0 中可以使用 pattern 别名)。
aliasstr参数在 URL 中的实际名称(例如,当 Python 变量名不能直接用作查询参数名时使用)。
deprecatedbool标记该参数是否已弃用,若为 True 则在文档中显示为弃用状态。
include_in_schemabool是否将该参数包含在 OpenAPI 模式中(默认为 True)。
exampleAny参数的示例值,用于文档生成。
examplesDict[str, Example]多个示例值(OpenAPI 3.1+ 支持),可提供不同场景的示例。
validation_aliasstr仅用于 Pydantic v2 中,指定验证时使用的别名。
serialization_aliasstr仅用于 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函数:

参数名类型描述
defaultAny字段的默认值。如果字段不是必填项,可以设置此值。使用 ... 或 Field(...) 表示该字段是必需的。
default_factoryCallable一个可调用的函数,用于生成复杂的默认值(如一个空的列表或字典)。
titlestr字段的标题,用于生成 OpenAPI 文档中的显示名称。如果未提供,默认使用字段名。
descriptionstr字段的详细描述,支持 Markdown 语法,会显示在生成的 API 文档中。
aliasstr字段的别名。在请求体中,将使用此别名来提取数据,这在 Python 变量名与 API 字段名不一致时非常有用。
gtfloat / int数值字段必须大于指定的值(greater than)。
gefloat / int数值字段必须大于等于指定的值(greater than or equal)。
ltfloat / int数值字段必须小于指定的值(less than)。
lefloat / int数值字段必须小于等于指定的值(less than or equal)。
min_lengthint字符串字段的最小长度。
max_lengthint字符串字段的最大长度。
patternstr字符串字段必须匹配的正则表达式。在 Pydantic v2 和 FastAPI 0.100.0+ 中推荐使用,替代 regex
regexstr(已弃用)字符串字段必须匹配的正则表达式。请使用 pattern 代替。
multiple_offloat / int数值字段必须是某个值的倍数。
max_digitsintDecimal 类型字段允许的最大数字位数(包括整数位和小数位)。
decimal_placesintDecimal 类型字段允许的最大小数位数。
exampleslist[Any] 或 dict字段的示例值,用于 API 文档。在 OpenAPI 3.1+ 中推荐使用。
exampleAny(已弃用)字段的单个示例值。建议使用 examples
deprecatedbool标记该字段是否已弃用,若为 True 则在生成的文档中显示为弃用状态。
include_in_schemabool是否将该字段包含在 JSON Schema 和 OpenAPI 文档中,默认为 True
json_schema_extradict用于向字段的 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 状态码分为五大类 ,以百位数区分:

分类范围含义常见代码举例
1xx100–199信息性响应100 Continue(继续)
2xx200–299成功200 OK(请求成功)、201 Created(资源已创建)、204 No Content(无返回内容)
3xx300–399重定向301 Moved Permanently(永久移动)、302 Found(临时重定向)、304 Not Modified(未修改,可使用缓存)
4xx400–499客户端错误400 Bad Request(请求格式错误)、401 Unauthorized(未认证)、403 Forbidden(禁止访问)、404 Not Found(资源不存在)、422 Unprocessable Entity(请求语义错误,如验证失败)
5xx500–599服务器错误500 Internal Server Error(服务器内部错误)、502 Bad Gateway(网关错误)、503 Service Unavailable(服务不可用)

重点说明

  • 422 在 FastAPI 中特别常用,当 Pydantic 模型验证失败时会自动返回 422。

  • 401 与 403 的区别:401 表示未提供有效凭证,403 表示已认证但无权限。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐