核心组件Starlette 负责web部分Starlette 是一个轻量级的 ASGIAsynchronous Server Gateway Interface框架专为构建异步 Web 应用设计Pydantic 负责数据部分Pydantic 是一个基于 Python 类型注解的数据验证和序列化库一、虚拟环境1.创建工程文件夹并进入创建一个虚拟环境py -3.14 -m venv .venvpy是因为有两个python版本2.激活在 Windows 上使用 Bashgit bashsource .venv/Scripts/activate3.检查是否激活which python如果它显示了在你工程的.venv/bin/python中的python二进制文件那么它就生效了/d/my_workspace/zpw/.venv/Scripts/python (.venv)4.安装软件包直接安装pip3.14 install fastapi[standard]从requirements.txt安装前提项目中有requirements.txtpip3.14 install -r requirements.txt5.运行(虚拟环境)fastapi dev main.py二、quick start三、路径操作路径操作装饰器fastapi支持各种请求方式app.get()app.post()app.put()app.patch()app.delete()app.options()app.head()app.trace()示例在mian文件中from fastapi import FastAPI app FastAPI() app.get(/get) async def get_test(): return {method:get方法} summary 接口的概述 description 接口的描述 response_description deprecated 接口是否废弃 deprecated True 废弃 app.post(/item,tags[这是一个items测试接口],summary概述, description描述, response_description响应描述) async def test(): return四、路由分发与django的路由分发类似 mian.pyprefix 统一前缀类似django总urls下的path(login/, include(apps.app_login.urls)),from fastapi import FastAPI from apps.app01.app01 import shop app FastAPI() 路由分发 app.include_router(shop,prefix/shop,tags[购物中心接口])项目同级目录下apps/app01/app01.pyfrom fastapi import APIRouter shop APIRouter() shop.get(/food) async def shop_food(): return {shop:food} shop.get(/bed) async def shop_bed(): return {shop:bed}五、请求与响应1.路径参数user_id为路径参数访问如下127.0.0.1:8000/user/user/123结果user_id:123}user.get(/user/{user_id}) async def get_user(user_id:int): print(user_id,type(user_id)) return {user_id:user_id}在fastapi中枯井是有顺序的如果/user/1 在/user/{user_id}上面时 当参数时1时访问的时/user/1的函数user.get(/user/1) async def get_user(): return {user_id:root_user} user.get(/user/{user_id}) async def get_user(user_id:int): print(user_id,type(user_id)) return {user_id:user_id}结果{user_id:root_user}2.查询参数路径函数中声明不属于路径参数的其他函数参数时他们将被自动解释为“查询字符串”参数就是路由之后用分割的键值对https://so.csdn.net/so/search?spm1000.2115.3001.4498qpython如下kd,xl,gj为查询参数curl -X GET \ http://127.0.0.1:8000/job/job?kd1xl2gj3 \ -H accept: application/jsonfrom fastapi import APIRouter job APIRouter() job.get(/job) async def get_job(kd,xl,gj): #基于kd,xl,gj数据库查询岗位信息 return { kd:kd, xl:xl, gj:gj }路径参数和查询参数可混合使用job.get(/job/{kd}) async def get_new_job(kd,xl,gj): #此时的kd为路径参数 return { kd:kd, xl:xl, gj:gj }其中参数也可设置为可选或不可选即xlNonejob.get(/job/new) async def get_or(kd:str|NoneNone,xlNone,gjNone): # 有默认参数即可以填也可以不填没有默认参数必填 return { kd:kd, xl:xl, gj:gj }有默认值的参数必须在最后如果async def get_or(kd,xlNone,gj):会报错Non-default argument follows default argumentPylance类型注解kd:str|NoneNone (python3.10的写法否则使用Union[str,None]None)kd既可以是字符串也可以是None 同时不填默认为None3.请求体FastAPI 基于PydanticPydantic主要用来做类型强制检查校验数据不符合类型要求就会抛出异常pip install pydanticname :字符串age整型birth日期yyyy-mm-ddfriends列表列表中为整型description字符串class User(BaseModel): name:str age:int birth:date friends:List[int] description:str data.post(/data) async def post_data(user:User): print(type(user)) print(user.name) # user是一个对象 print(user.model_dump()) # 转为字典 return user打印class apps.app04.app04.Userzpw{name: zpw, age: 18, birth: datetime.date(2026, 3, 30), friends: [1, 2, 3]}在request body中添加{name: zpw,age: 18,birth: 2026-03-30,friends: [1,2,3]}输出{ name: zpw, age: 18, birth: 2026-03-30, friends: [ 1, 2, 3 ] }还可以为字段添加默认值class User(BaseModel): # 默认root name:str root # 默认18 且大于0 小于100 age:int Field(default18,gt0,lt100) # 既可以是date 也可以None 默认None birth:date|None None # 默认空列表 friends:List[int] [] description:str None字段自定义validator 已废弃请用 field_validatorclass User(BaseModel): name:str root age:int Field(default18,gt0,lt100) birth:date|None None friends:List[int] [] description:str None field_validator(name) def name_must_alpha(cls,value): assert value.isalpha(),name必须是字母 return value组合嵌套在User中嵌套Addrclass Addr(BaseModel): province:str city:str class User(BaseModel): name:str root age:int Field(default18,gt0,lt100) birth:date|None None friends:List[int] [] description:str None addr:Addr field_validator(name) def name_must_alpha(cls,value): assert value.isalpha(),name必须是字母组成 return value4.form表单5.文件上传6.request对象7.请求静态文件8.响应模型相关参数