【python|框架】FastAPI基础

📅 2026/8/13 13:25:08
【python|框架】FastAPI基础
一.介绍1.1 概念FastAPI 是一个现代、高性能的 Python Web 框架用于构建 API完全基于标准的 Python 类型提示。它构建在Starlette负责 Web 部分和Pydantic负责数据验证与序列化之上。1.2 特性极速性能媲美 Node.js 和 Go异步处理并发能力强。自动文档写好代码就自动生成 Swagger UI 和 ReDoc 交互文档。查看交互式文档/docs类型驱动利用 Python 类型提示自动完成参数解析、数据验证和编辑器智能提示。内置校验通过 Pydantic 模型自动验证请求/响应数据错误信息清晰。FastAPI 中Pydantic 负责处理请求体、查询参数、响应数据的校验和转换。简洁优雅路由定义直观依赖注入系统复用逻辑简单开发效率高。1.3 安装pip install fastapi uvicorn[standard]Uvicorn 是一个 ASGI异步服务器网关接口服务器用于运行 FastAPI 等异步 Python Web 框架。简单说它是让 FastAPI 代码真正运行起来的服务器。加上[standard]会安装可选依赖以获得更高性能。1.4 运行方式命令适用场景模块运行python -m uvicorn 程序名:实例名 --reload当前终端立即生效直接命令uvicorn 程序名:实例名 --reload重新打开终端后可用--reload 修改代码后服务器会自动重启二.路由路由是指将 URL 路径映射到具体的处理函数的过程。a.get(/) async def root(): return {Hello: World666}a:实例名get:请求方法三.参数3.1 路径参数3.1.1 概念路径参数是 URL 路径中动态的部分用于标识具体资源。在路径中用{参数名}声明。3.1.2 格式from fastapi import FastAPI,Path可导入Path,使用Path()进行高级校验app.get(/items/{item_id}) async def read_item(item_id: int Path(..., gt0,lt100)): return {item_id: item_id}常见的Path参数参数说明...必填title在 API 文档中显示的标题description详细描述ge/le数值大于等于 / 小于等于gt/lt数值大于 / 小于min_length/max_length字符串长度限制3.2 查询参数3.2.1 概念查询参数是 URL 中?后面的键值对通常用于过滤、排序、分页等非资源标识信息。3.2.2 格式from fastapi import FastAPI,Query可导入Query,使用Query进行校验和元数据参数同Path类型app.get(/news/news_list) async def news_list( skip: int Query(0), limit: int 10): return {skip: skip, limit: limit}在 FastAPI 中函数参数只要不是路径参数且不是 Pydantic 模型就会被自动识别为查询参数。3.3 请求体参数3.3.1 概念请求体是客户端发送给 API 的数据通常用在POST、PUT、PATCH等方法中数据格式一般为 JSON。请求体作用创建更新资源在 FastAPI 中把 Pydantic 模型声明为函数参数就是请求体参数。3.3.2 格式from fastapi import FastAPI from pydantic import BaseModel,Field可导入Feild校验和元数据常见参数同Pathclass User(BaseModel): username: str Field(default张三,min_length2,max_length20) password: str Field(min_length2,max_length20) app.post(/register) async def register_user(user: User): return user四.响应响应类型主要指两个方面定义返回数据的结构和类型通过 response_model指定响应的格式和方式通过 response_class 或直接返回特定对象4.1 JSON格式JSON 是默认的请求与响应格式app.get(/) def read_root(): return {Hello: World}4.2 HTML格式适用html页面from fastapi.responses import HTMLResponse app.get(/html,response_classHTMLResponse) async def html(): return h1一级标题/h14.3 File格式适用于磁盘上已有的文件FastAPI 会自动处理文件传输、MIME 类型(媒体类型)和断点续传支持。from fastapi.responses import FileResponse app.get(/file) async def file(): path file.txt return FileResponse(path)常见MIME类型数据类型MIME 类型JSONapplication/jsonHTMLtext/html纯文本text/plainPDFapplication/pdfPNG 图片image/pngJPEG 图片image/jpegMP4 视频video/mp4ZIP 压缩包application/zip文件上传multipart/form-data4.4 自定义格式在 FastAPI 中自定义格式通常指返回非标准结构、自定义 MIME 类型、或对输出数据进行特殊序列化的场景。class Item(BaseModel): id: int name: str description: str app.get(/items/{item_id},response_modelItem) async def read_item(item_id: int): return { id: item_id, name: fItem {item_id}, description: fDescription {item_id}, }五.问题与解决1.当进程未关闭时新运行的进程为什么无法显示因为在原来的端口被占用只能显示最先在该端口上运行的进程。查找占用 8000 端口的进程 PIDnetstat -ano | findstr :8000杀掉对应的 PID把 123 换成你查到的数字taskkill /F /PID 123一键杀掉所有python进程taskkill /F /IM python.exe2.为什么我明明没有写端口两个程序占用端口是同一个因为 Uvicorn 默认使用 8000 端口不管你运行哪个文件3.为什么中文文件名的程序无法启动pathon不支持中文名终端无法导入该模块。导致启动失败4.ASGI是什么为什么需要 ASGIASGIAsynchronous Server Gateway Interface异步服务器网关接口是 Python Web 框架与异步 Web 服务器之间通信的标准规范。它是 WSGI 的继任者专为异步、高并发场景设计。传统的 WSGI如 Flask、Django 早期是同步的一个请求必须完全处理完才能处理下一个。而 ASGI 原生支持异步处理可以用 async / await不阻塞线程。长连接WebSocket、Server-Sent EventsSSE。高并发能更高效地处理大量同时连接。