1、概述与安装


官方文档:FastAPI

官方源码:https://github.com/tiangolo/fastapi

1.1简介

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于 Python 构建 API。它专为高效开发和运行而设计,结合了 Python 类型提示的强大功能,提供了自动生成交互式 API 文档的能力。

1.2主要特点

高性能
FastAPI 基于 Starlette(轻量级 ASGI 框架)和 Pydantic(数据验证库),性能接近 Node.js 和 Go 等语言的高性能框架。

开发效率高
自动生成 OpenAPI 和 JSON Schema 文档,支持交互式 API 测试(通过 Swagger UI 或 ReDoc)。减少手动编写文档的工作量。

类型安全
充分利用 Python 的类型提示功能,提供强大的数据验证和编辑器智能提示支持,减少运行时错误。

异步支持
原生支持异步请求处理(基于 ASGI),适合现代高并发应用场景,如微服务和高频 IO 操作。

适用场景

  • 构建 RESTful API 或 GraphQL API
  • 开发微服务架构的后端服务
  • 需要自动生成 API 文档的项目
  • 对性能要求较高的 Web 应用

1.3安装与创建

  • 环境准备(Python 3.7+)
  • 安装FastAPI和相关依赖
  • 创建第一个FastAPI应用
  • 运行开发服务器(uvicorn)

1.3.1 安装fastapi库和uvicorn库

命令行:pip install fastapi -i https://mirrors.aliyun.com/pypi/simple/

命令行:pip install "uvicorn[standard]" -i https://mirrors.aliyun.com/pypi/simple/

1.3.2 创建api项目

第一步:

第二步:创建python文件

import uvicorn
from fastapi import FastAPI # 导入fastAPI,用于定义api
app = FastAPI() # 创建FastAPI实例

@app.get("/") # 定义路由,访问根路径调用read_root函数,并返回Hello World字符串数据
async def read_root():
    return {"message": "Hello World"}
 
@app.get("/hello/{name}")
async def say_hello(name: str):
    return {"message": f"Hello {name}"}

if __name__ == "__main__":
    print("启动服务")
    uvicorn.run("mian:app",host="127.0.0.1",port=8000,reload=True)

第三步:打开终端执行uvicorn main:app --reload

第一种启动方式:命令行

第二种启动方式直接运行:

此时可以再地址栏输入:127.0.0.1:8000/,输出如下:

输入:127.0.0.1:8080/hello/李四,得到输出如下:

2、案例

2.1 案例一

import uvicorn
from fastapi import FastAPI # 导入fastAPI,用于定义api
app = FastAPI() # 创建FastAPI实例

@app.get("/") # 定义路由,访问根路径调用read_root函数,并返回Hello World字符串数据
async def read_root():
    return {"message": "Hello World"}

@app.get("/hello/{name}")
async def say_hello(name: str,password:str|None= None):
    """
        异步处理HTTP GET请求,返回问候消息
        参数:
            name (str): 用户名称,从URL路径中获取
            password (str | None): 可选的密码参数,默认为None
        返回:
            dict: 包含问候消息的字典,格式为{"message": "Hello {name},密码锁定为{password}"}
    """
    return {"message": f"Hello {name},密码锁定为{password}"}

# @app.get("/hello/{name}")
# async def say_hello(name: str,password:[str,None]= None): # 这是第二种写法,定义密码为字符串或者空
#     return {"message": f"Hello {name},密码锁定为{password}"}

if __name__ == "__main__":
    print("启动服务")
    uvicorn.run("mian:app",host="127.0.0.1",port=8000,reload=True)

2.2案例二

from typing import Union # 导入Union,用于定义可选类型
import uvicorn # 引入uvicorn,用于启动服务
from fastapi import FastAPI,Request # 导入FastAPI,用于构建RESTful API
from pydantic import BaseModel # 引入pydantic类,用于定义数据结构

app = FastAPI() # 创建FastAPI实例

class Item(BaseModel):
    """
    定义一个商品信息的数据模型类

    属性:
        name (str): 商品名称
        price (float): 商品价格
        is_offer (Union[bool, None]): 是否为优惠商品,可选属性,默认为None
    """
    name: str
    price: float
    is_offer:Union[bool,None]=None




@app.get("/")
# 定义路由,访问根路径调用read_root函数,并返回Hello World字符串数据
async def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q:Union[str, None] = None):
    """
    根据物品ID获取物品信息

    参数:
        item_id (int): 物品的唯一标识符
        q (Union[str, None], optional): 查询参数,可选

    返回:
        dict: 包含物品ID和查询参数的字典
    """
    return {"item_id": item_id, "q": q}

@app.put("/items/{item_id}")
# 测试访问:
async def update_item(item_id:int,item:Item):
    """
    更新指定ID的物品信息

    参数:
        item_id (int): 要更新的物品的唯一标识符
        item (Item): 包含物品信息的Item对象

    返回:
        dict: 包含物品名称和物品ID的字典
    """
    return {"item_name": item.name, "item_id": item_id}





if __name__ == "__main__":
    print("启动服务")
    uvicorn.run("main1:app",host="127.0.0.1",port=8000,reload=True)

同时写一个test测试类用于测试

此为test测试模块

import requests

# 测试 GET
response = requests.get("http://127.0.0.1:8000/items/1")
print("GET响应:", response.json())

# 测试 PUT
# 准备要更新的商品数据,包含商品名称、价格和是否为特价商品的标识
data = {"name": "笔记本电脑", "price": 5999.99, "is_offer": True}

# 向指定的商品接口发送PUT请求,用于更新ID为1的商品信息
response = requests.put("http://127.0.0.1:8000/items/1", json=data)

# 输出服务器返回的响应结果
print("PUT响应:", response.json())

3、FastAPI交互式API文档

FastAPI自动生成交互式API文档,支持Swagger UI和ReDoc两种界面。这些文档基于OpenAPI标准,允许用户直接测试API端点。

3.1Swagger UI文档访问

启动FastAPI应用后,默认路径为/docs。该界面提供API端点列表、参数描述及实时测试功能。

  • 访问方式:如http://127.0.0.1:8000/docs(看你设置的域名加端口号)
  • 支持自动生成请求示例
  • 可直接填写参数并发送请求
  • 显示响应模型和状态码说明

3.2 交互式文档的优势

实时更新

系统或数据能够即时反映最新状态,无需手动刷新或干预。适用于动态数据监控、协同编辑、实时通信等场景,确保用户始终获取最新信息。

自动验证

通过预设规则或脚本自动检查数据的准确性、完整性或逻辑性。减少人工核对成本,常见于表单提交、API响应测试、数据库一致性检查等场景。

便于测试

设计或工具提供清晰的测试接口、模拟环境或调试支持,例如单元测试框架、沙箱环境、日志追踪等。降低测试复杂度,加速开发迭代。

4、路由api的分发

4.1创建api文件以及模块

4.2 csb.py(源码)

# 出版社分发路由配置
from fastapi import APIRouter
# 创建路由
api_cbs = APIRouter()

@api_cbs.get("/get")
async def get_cbs():
    return  {"method":"出版社分发路由get方法"}

@api_cbs.post("/post")
async def post_test():
    return {"method":"出版社分发路由post方法"}

@api_cbs.put("/put")
async def put_test():
    return {"method":"出版社分发路由put方法"}

@api_cbs.delete("/delete")
async def delete_test():
    return {"method":"出版社分发路由delete方法"}


4.3 ts.py(源码)

# 图书分发路由配置
from fastapi import APIRouter

api_ts = APIRouter() # 创建路由

@api_ts.get("/get")
async def get_test():
    return  {"method":"图书分发路由get方法"}

@api_ts.post("/post")
async def post_test():
    return {"method":"图书分发路由post方法"}

@api_ts.put("/put")
async def put_test():
    return {"method":"图书分发路由put方法"}

@api_ts.delete("/delete")
async def delete_test():
    return {"method":"图书分发路由delete方法"}

4.3 zz.py(源码)

# 作者分发路由配置
from fastapi import APIRouter

api_zz = APIRouter()

@api_zz.get("/get")
async def get_zz():
    return {"method":"作者分发路由get方法"}

@api_zz.post("/post")
async def post_zz():
    return {"method":"作者分发路由post方法"}

@api_zz.put("/put")
async def put_zz():
    return {"method":"作者分发路由put方法"}

@api_zz.delete("/delete")
async def delete_zz():
    return {"method":"作者分发路由delete方法"}

4.4 main1.py(分发api)

from typing import Union # 导入Union,用于定义可选类型
import uvicorn # 引入uvicorn,用于启动服务
from fastapi import FastAPI,Request # 导入FastAPI,用于构建RESTful API
from pydantic import BaseModel # 引入pydantic类,用于定义数据结构
from api.ts import api_ts
from api.cbs import api_cbs # 导入三个api路由分发
from api.zz import api_zz

# 创建FastAPI应用实例,用于注册路由和处理HTTP请求
app = FastAPI()
# 注册图书相关路由,所有请求路径以/ts开头,标签为"图书"
app.include_router(api_ts, prefix="/ts", tags=["图书"])
# 注册出版社相关路由,所有请求路径以/cbs开头,标签为"出版社"
app.include_router(api_cbs, prefix="/cbs", tags=["出版社"])
# 注册作者相关路由,所有请求路径以/zz开头,标签为"作者"
app.include_router(api_zz, prefix="/zz", tags=["作者"])



if __name__ == "__main__":
    print("启动服务")
    uvicorn.run("main1:app",host="127.0.0.1",port=8000,reload=True)

在地址栏输入127.0.0.1:8000:/docs能够得到以下:

(注意其他占用8000端口号要记得关闭)

5、request对象

requests是Python中一个流行的HTTP库,用于发送HTTP请求和处理响应。requests对象通常指通过该库发起的请求或返回的响应对象,核心类是requests:Requestrequests:Response

主要功能

  • 发送HTTP请求:支持GET、POST、PUT、DELETE等方法。
  • 处理响应:自动解析响应内容(JSON、文本、二进制等)。
  • 会话管理:通过Session对象保持持久性参数(如cookies、headers)。
  • 高级功能:超时设置、代理支持、文件上传等。

假设我们定义了request:Requests,那么该对象可以获取到那些信息呢?

代码如下:

from typing import Union # 导入Union,用于定义可选类型
import uvicorn # 引入uvicorn,用于启动服务
from fastapi import FastAPI,Request # 导入FastAPI,用于构建RESTful API
from pydantic import BaseModel # 引入pydantic类,用于定义数据结构


# 创建FastAPI应用实例,用于注册路由和处理HTTP请求
app = FastAPI()





@app.get("/homes")
async def homes(username:str,userpass:str|None = None):
    """
    处理获取用户家庭信息的GET请求

    参数:
        username (str): 用户名
        userpass (str|None): 用户密码,可选参数,默认为None

    返回:
        dict: 包含方法名、用户名和密码的字典
    """
    return {"method":"gethome","用户名":username,"密码":userpass}

@app.get("/get_login")
async def get_login(request:Request):
    """
   处理用户登录的GET请求
    参数:
        request (Request): HTTP请求对象,包含查询参数
    返回:
        dict: 登录结果信息,包括方法名、用户名和密码或错误信息
    """
    try:
        # 从请求查询参数中获取用户名和密码
        username = request.query_params["username"]
        userpass = request.query_params["userpass"]
        # 验证用户名和密码是否匹配预设值
        if username == "张三" and userpass == "123":
            return {"method": "登入成功", "用户名": username, "密码": userpass}
        else:
            return {"登入失败"}
    except Exception as e:
        # 捕获异常并返回错误信息
        return {"method": f"登录功能出错{e}"}

@app.post("/post_login")
async def get_login(request:Request):
    """
   处理用户登录的POST请求
    参数:
        request (Request): HTTP请求对象,包含查询参数
    返回:
        dict: 登录结果信息,包括方法名、用户名和密码或错误信息
    """
    try:
        # 从请求查询参数中获取用户名和密码
        username = request.query_params["username"]
        userpass = request.query_params["userpass"]
        # 验证用户名和密码是否匹配预设值
        if username == "张三" and userpass == "123":
            return {"method": "登入成功", "用户名": username, "密码": userpass}
        else:
            return {"登入失败"}
    except Exception as e:
        # 捕获异常并返回错误信息
        return {"method": f"登录功能出错{e}"}

if __name__ == "__main__":
    print("启动服务")
    uvicorn.run("main1:app",host="127.0.0.1",port=8000,reload=True)

请求接口代码为:

第一种:get方法登录

import requests


# get登录 请求的写法
# 获取用户输入的用户名和密码,并向本地服务器发送登录请求
# 参数: 无
# 返回值: 无
# 功能:
# 1. 从标准输入获取用户名和密码
# 2. 向本地服务器发送GET请求进行登录验证
# 3. 打印服务器响应结果

username = input("请输入用户名:")
userpass = input("请输入密码:")

# 发送登录请求到本地服务器
res = requests.get(f"http://127.0.0.1:8000/get_login?username={ username}&userpass={userpass}")

# 输出服务器响应对象和响应文本内容
print(res)
print(res.text)

第二种:post方法登录

import requests


# post 登录的写法
username = input("请输入用户名:")
userpass = input("请输入密码:")
# 构造登录请求参数字典,包含用户名和密码
params = {"username":username,"userpass":userpass}
# 设置登录接口URL地址
url = "http://127.0.0.1:8000/get_login"
# 向登录接口发送POST请求,传递用户登录信息
res = requests.post(url,params=params)

print(res)
print(res.text)

Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐