【后端开发】FastAPI基础

2026.6.21

一、代码
1.导包
fromfastapiimportFastAPI# from ... import ...

手动配置的方法:
终端输入:(确保终端提示符前有 (.venv) 标记)

pip install fastapi uvicorn
2.创建实例

FastAPI实例app

app=FastAPI()
3.定义接口
@app.get("/")# 访问路径为根asyncdefroot():# async ---异步函数return{"message":"Hello World"}@app.get("/hello/{name}")asyncdefsay_hello(name:str):return{}
二、运行

浏览器中访问接口

1.运行方法
  1. run按钮
    停止运行:stop(下方左上角红色正方形按钮)

  2. 命令行

    打开终端terminal,确保终端位置是当前根目录,输入命令

    uvicorn main:app--reload# uvicorn 文件名:fastapi实例名 --reload(最好加上)

    uvicorn:fastapi高性能的服务器,用来运行fastapi项目

    –reload:表示修改代码后自动重启服务器
    (开启热重载,当文件改变之后,自动重启下服务器载入改动)

    CTRL+C:停止运行,可按上键进行代码修改,按回车再运行

注:run按钮修改代码后记得ctrl+s保存,才能达到–reload同样效果,自动重启服务

2.可交互式文档

fastapi项目运行后可自动生成可交互式文档,访问方式 /docs

三、路由

作用:访问不同地址,拿到不同结果

路由是URL地址和处理函数之间的映射关系,它决定了当用户访问某个特定地址时,服务器应执行哪段代码来返回结果。
(映射:在两个东西之间建立一种明确的对应关系,输入A一定会输出B)

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

@app.get("/")# @+FastAPI实例.请求方法("请求路径")asyncdefroot():# 执行root函数return{"message":"Hello World"}# 返回值--响应结果

动手实操:

# 访问/hello 响应结果: msg: 你好 fa一下@app.get("/hello")# 装饰器 (括号内-请求路径)asyncdefhello_fa():return{"msg":"你好,fa一下"}# 处理函数:对象-键值对格式

运行,默认访问根路径,在后面加上/hello,访问该路由。
可交互式文档中也有。

四、参数

同一接口,参数不同返回不同结果,实现了接口的动态交互。

1.路径参数

位置:URL路径的一部分 eg. /book/{id} 定义了id参数
作用:指向唯一的、特定的资源
方法:GET

请求路径中{}定义,处理函数内加同名形参,路径参数值传入处理函数同名形参

@app.get("/book/{id}")# 定义路径参数idasyncdefget_book(id:int):# 同名形参:int类型注解-约定参数类型return{"id":id,"title":f"这是第{id}本书"}

用户传入的值会出现在URL路径的位置

类型注解 Path
FastAPI允许为参数声明额外的信息和校验

  1. 导入FA的Path函数
fromfastapiimportFastAPI,Path# 导入
  1. 在原生类型注解基础上,=赋值Path函数,括号内添加参数:
  • … 必填
  • gt/ge 大于/大于等于
  • lt/le 小于/小于等于
  • description 描述
  • min_length max_length 长度限制
@app.get("/book/{id}")asyncdefget_book(id:int=Path(...,)):# =赋值Path函数return{"id":id,"title":f"这是第{id}本书"}
2.查询参数

对大量数据进行过滤…获取数据。

不需要在路径上定义参数,直接在处理函数中添加形参,自动解释为查询参数
=赋形参默认值

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

位置:URL?之后拼接规则:参数名key=参数值value,&拼接
作用:对资源集合进行过滤、排序、分页等操作
方法:GET

# 查询新闻 分页功能 skip:跳过的记录数,limit:返回的记录数@app.get("/news/news_list")asyncdefget_news_list(skip:int,limit:int=10):return{"skip":skip,"limit":limit}

查询参数额外类型注解 Query

  1. 导入
  2. =Query()
fromfastapiimportQuery@app.get("/news/news_list")asyncdefget_news_list(skip:int=Query(...),limit:int=10):return{"skip":skip,"limit":limit}
3.请求体参数

实际要发送到服务器的数据
比前两个参数直接拼接到URL中相比,更安全。

HTTP协议中,一个完整的请求由三部分组成:
1.请求行:方法、URL、协议版本
2.请求头:元数据信息(内容类型,
3.请求体:实际要发送的数据内容

位置:HTTP请求的消息体(body)中
作用:创建、更新资源
方法:POST、PUT等 (post:向服务器提供数据)

  1. 定义类型
    继承 BaseModel(自动获得验证能力),pydantic强制验证类型
fromfastapiimportBaseModelclassUser(BaseModel):# User继承BaseModelusername:str# 数据属性和类型password:str
  1. 类型注解
@app.get("/register}")asyncdefregister(user:User):# 参数: 类型名returnuser

则发请求传递参数时,按定义好的类型传递
在-d里(body)
![[Pasted image 20260512210739.png]]

类型注解 Field函数(在pydantic中)

1.导入

frompydanticimportBaseMode,Field

2.原基础上=Field(…)

classUser(BaseModel):username:str=Field(...)password:str=Field(...)

参数(new):

  • default 默认值
五、请求与响应
1.响应类型

fastapi默认支持JSON格式

2.响应类型设置方式
  1. 装饰器中指定响应类
    场景:固定返回类型(HTML、纯文本)
    在请求路径,response class =赋值响应类
    1. 导入需要的类型
    2. 请求路径后+
fromfastapi.responsesimportHTMLResponse@app.get("/html",response_class=HTMLResponse)asyncdefget_html():return"<h1>hello ctf</h1>"
  1. 返回响应对象(直接return)
    场景:文件下载、图片、流式响应(逐步返回或不确定响应类型)
    returnFileResponse()
    1. 导入
fromfastapi.responsesimportFileResponse@app.get("/file")asyncdefget_file():file_path="./file/1.png"# jpeg?returnFileResponse(file_path)

响应文件对象给客户端

3.自定义响应数据格式

当一个接口响应的数据格式是JSON时,可以自定义一个数据格式【类】,用类约定响应的数据包含哪些属性,用什么类型。

@app.get("/news/{id}")asyncdefget_news(id:int):return{"id":id,"":,}

固定接口返回数据格式。用自定义类来约束响应的数据格式。

给路径装饰器加参:response_model(路径操作装饰器的关键参数),它通过一个Pydantic模型来严格定义和约束API端点的输出格式。接口得听这个类型的话。

frompydanticimportBaseModelclassNews(BaseModel):# 1. 准备一个基于pydantic的类id:inttitle:strcontent:str@app.get("/news/{id}",response_model=News)# 这个接口听这个类的话 装饰器加参数response_model=类名asyncdefget_news{id:int}:return{"id":id"title":{"第{id}本书"}"content":"good"}

此接口响应的数据格式只能是news类型,如果不是,就会直接报错。

# 需求:新闻接口 -> 响应数据格式 id、title、content# 约定数据格式——先定义类型frompydanticimportBaseModel app=FastAPI()classNews(BaseModel)# 子承父业id:inttitle:strcontent:str@app.get("/news/{id}",response_model=News)# 设置数据格式 路径装饰器加参asyncdefget_news(id:int):# 路径参数 同名形参return{"id":id,"title":f"第{id}本书","content":"good"}

![[Pasted image 20260521011140.png]]

这一机制在提供自动数据验证和序列化的同时,更是保障数据安全性的第一道防线。

4.异常响应处理

对于客户端引发的错误,应使用 fastapi.HTTPException 来中断正常处理流程,并返回标准错误响应。
判断异常:raise抛出HTTPException(status_code= …)

fromfastapiimportFastAPI,HTTPException# 1. 导包@app.get('/news/{id}')asyncdefget_news(id:int):id_list=[1,2,3,4,5,6]ifidnotinid_list:# 按需求写判断条件(判断异常)raiseHTTPException(status_code=404,detail="滚木id喵")# 必填参数-状态码 可选参数return{"id":id}# JSON形式响应客户端
# 需求:按id查询新闻 1~6# 1.导包fromfastapiimportFastAPI,HTTPException app=FastAPI()@app.get("/news/{id}")# 路径参数:指向唯一特定的资源asyncdefget_news(id:int)# 路径参数-同名形参id_list=[1,2,3,4,5,6]ifidnotinid_list:raiseHTTPException(status_code=404,detail="滚木滚木")return{"id":id}

正常:返回键值对
异常:返回detail