Python学习笔记--FastAPI入门常规操作
一.简介
- FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,专为在 Python 中构建 RESTful API 而设计。
- FastAPI 使用 Python 3.8+ 并基于标准的 Python 类型提示。
- FastAPI 建立在 Starlette 和 Pydantic 之上,利用类型提示进行数据处理,并自动生成API文档。
- FastAPI 于 2018 年 12 月 5 日发布第一版本,以其易用性、速度和稳健性在开发者中间迅速流行起来。
- FastAPI 支持异步编程,可在生产环境中运行。
二.特点
- 高性能: 基于Starlette和Pydantic,利用异步(asynchronous)编程,提供出色的性能。
- 自动文档生成: 自动生成交互式API文档,支持Swagger UI和ReDoc,让API的理解和测试更加直观。
- 类型注解支持: 利用Python的类型提示,提供更严格的输入验证和更好的代码提示。
- 异步支持: 支持异步请求处理,使得处理IO密集型任务更加高效。
三.适用场景
- 构建API后端: 用于构建RESTful API,支持前后端分离的Web应用。
- 微服务架构: 可以作为微服务的后端框架,支持快速开发和部署。
- 数据处理API: 适用于处理数据,接收和返回JSON数据。
- 实时通信: 支持WebSocket,适用于实时通信场景。
四.安装
FastAPI 依赖 Python 3.8 及更高版本。
安装 FastAPI 很简单,这里我们使用 pip 命令来安装。
pip install fastapi
另外我们还需要一个 ASGI 服务器,生产环境可以使用 Uvicorn 或者 Hypercorn
pip install "uvicorn[standard]"
五.使用
FastAPI 提供了内置的交互式 API 文档,使开发者能够轻松了解和测试 API 的各个端点。
这个文档是自动生成的,基于 OpenAPI 规范,支持 Swagger UI 和 ReDoc 两种交互式界面。
通过 FastAPI 的交互式 API 文档,开发者能够更轻松地理解和使用 API,提高开发效率
在运行 FastAPI 应用时,Uvicorn 同时启动了交互式 API 文档服务。
默认情况下,通过访问 http://127.0.0.1:8000/docs 来打开 Swagger UI 风格的文档,通过访问 http://127.0.0.1:8000/redoc 来打开 Swagger UI 风格的文档。
下面简单介绍下开发中常见请求的使用方法
5.1 Get请求--不带任何参数
创建一个名为 main.py 的文件,添加以下代码:
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"Hello": "FastAPI"}#添加主程序入口,pycharm即可启动运行,下同,不再单独列出if __name__ == "__main__":import uvicornuvicorn.run(app)
5.2 Get请求--使用变量作为请求地址的一部分
@app.get("/items/{item_id}")
def read_item(item_id: int,q:Union[str,None]=None):return {"item_id": item_id,"q":q}
该请求接受两个参数:
- item_id --是路径参数,指定为整数类型。
- q -- 是查询参数,指定为字符串类型或空(None)。
函数返回一个字典,包含传入的 item_id 和 q 参数。
q 参数通过 Union[str, None] 表示可以是字符串类型或空,这样就允许在请求中不提供 q 参数
返回结果
5.3 Get请求--将请求参数拼接在地址后面
下面的请求中,提供了默认值,如果参数有提供,则覆盖默认值,否则就使用默认值
@app.get("/items/")
def read_items(skip: int = 0, limit: int = 100):return {"skip": skip, "limit": limit}
5.4 Put请求
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = None# is_offer: Union[bool,None] = None@app.put("/items/{item_id}")
def update_item(item_id:int,item:Item):return {"item_name": item.name,"item_id":item_id}
5.5 Post请求
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = None@app.post("/items")
def create_item(item:Item):return item
上面请求中返回 Pydantic 模型,路由处理函数返回一个 Pydantic 模型实例,FastAPI 将自动将其转换为 JSON 格式,并作为响应发送给客户端。
Pydantic 是一个用于数据验证和序列化的 Python 模型库。
它在 FastAPI 中广泛使用,用于定义请求体、响应体和其他数据模型,提供了强大的类型检查和自动文档生成功能。
使用 Pydantic 定义一个模型非常简单,只需创建一个继承自 pydantic.BaseModel 的类,并在其中定义字段。字段的类型可以是任何有效的 Python 类型,也可以是 Pydantic 内置的类型。
5.6获取请求头和Cookie
from fastapi import FastAPI, Header, Cookie@app.get("/header_and_cookie")
def read_header_and_cookie(user_agent: str = Header(None),session_token: str = Cookie(None)):return {"user_agent":user_agent,"session_token":session_token}
5.7 重定向
from starlette.responses import RedirectResponse@app.get("/redirect")
def redirect():return RedirectResponse(url="/items/1234")
该方法将请求重定向到上面定义的items请求
5.8 抛出异常,返回自定义的状态码和详细信息
from fastapi import HTTPException@app.get("/exception_test/{item_id}")
def exception_test(item_id:int):if item_id <10:raise HTTPException(status_code=404, detail="Item not found")return {"item_id": item_id}
5.9 接收表单数据
from fastapi import Form@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):return {"username": username}
5.10 文件上传
from fastapi import UploadFile, File@app.post("/files/")
async def upload_file(file: UploadFile = File(...)):return {"filename": file.filename}