FastAPI快速入门
1、FastAPI简介
FastAPI 是一个基于 Python 的现代化 Web 框架,它主要用于构建Restful的Web API应用。虽然Python领域已经有了Django、Flask这样强大的Web框架,但FastAPI更年轻、更快、也更加简单。
对于一些中小型项目,或者仅仅只是为自己开发的AI应用、大数据处理应用提供一下api接口,那么FastAPI凭借其优异的性能、异步高并发处理能力、自动化的API文档生成等特性,应该可以成为你完美的选择。
FastAPI与Django、Flask
FastAPI与Django、Flask都是Python领域优秀的Web框架,它们各有自己的关注领域,下表列出它们之间的一些区别和应用场景,以供参考:
特性 | FastAPI | Django | Flask |
---|---|---|---|
性能 | 基于 Starlette 和 Pydantic,异步支持优秀 | 支持异步但性能不如 FastAPI | 轻量级,但同步为主 |
开发效率 | 自动生成 API 文档,减少重复代码 | 内置 ORM、Admin 管理后台,高效开发 | 灵活但依赖插件 |
类型安全 | 完整的类型提示和数据校验 | 使用表单和模型校验,类型提示较弱 | 靠开发者自行处理 |
异步支持 | 原生支持 async/await,性能极佳 | 支持异步视图,但实现较复杂 | 异步支持较弱,需依赖扩展 |
API文档生成 | 自动生成 Swagger 和 ReDoc 文档 | 需手动编写 API 文档 | 使用插件生成 API 文档 |
学习曲线 | 语法简洁,基于类型注解易于上手 | 全栈框架,功能全面,学习成本较高 | 极简,适合初学者 |
生态系统 | 依赖于第三方库,生态逐渐丰富 | 完整生态,包括 ORM、Admin、认证等 | 插件丰富,自由组合 |
使用场景 | API、AI 服务、微服务架构、数据处理 | 全栈 Web 应用、大型项目 | 原型开发、小型应用、REST API |
2、FastAPI的安装
FastAPI的核心组成
Uvicorn — ASGI(Asynchronous Server Gateway Interface)服务器
Uvicorn支持现代协议,包括 HTTP/2 和 WebSocket,支持 async 和 await,在处理 I/O 密集型任务时表现优异,使用 uvloop 和 httptools 提供了极高的性能。
Starlette —负责 web 部分
FastAPI 是基于 Starlette 构建的,它使用 Starlette 提供的核心功能。它特别适合用于构建 API、WebSocket 服务和微服务。
Pydantic —负责数据部分
Pydantic 是一个强大的数据验证和解析库,通过类型提示简化了数据处理。它广泛用于 FastAPI 等现代 Python 框架中,用于数据校验、JSON 解析、配置管理等场景。
FastAPI的安装
安装FastAPI
pip install fastapi
安装Uvicorn
pip install "uvicorn[standard]"
3、FastAPI CLI脚手架
FastAPI CLI 是一个命令行程序,你可以用它来部署和运行你的 FastAPI 应用程序,管理你的 FastAPI 项目。完成FastAPI的安装即可在终端中使用FastAPI CLI提供的 fastapi
命令。
fastapi dev
以开发模式运行fastapi应用,此时当你更改代码时,它会自动重新加载服务器。
fastapi run
以生产环境模式运行fastapi应用,此时自动重载是禁用的。
4、第一个WebAPI程序
创建:创建一个 main.py 文件并写入以下内容
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def hello_world():
return {"Hello": "World"}
@app.get("/book_list/{category}")
def book_list(category: str,size:int = 3):
books = [
{'title':'python handbook','category':'tech'},
{'title':'c/c++ handbook','category':'tech'},
{'title':'java handbook','category':'tech'},
{'title':'coffee cookbook','category':'food'},
{'title':'cake cookbook','category':'food'}
]
return {"book_list": list(filter(lambda book: book['category'] == 'tech', books))[:size], "size": size}
运行:通过以下命令运行服务器
uvicorn main:app --reload
测试:在浏览器中打开http://127.0.0.1:8000/docs
可以看到如下API文档,填写适当的参数便可进行测试。