欢迎光临
我们一直在努力

FastAPI了解入门

提示:文章写完后,目录di可以自动生成,如何生成可参考右边的帮助文档

初步认识FastAPI

  • 目录
  • 一、什么是异步编程?异步编程和同步编程的区别?
  • 二、异步编程的使用步骤
    • 1.了解语法以及格式
    • 2.代码实例展示
  • 三、什么是进程,线程,协程,三者之间的关系是什么
  • 四、事件循环
  • 五、FastAPI路径参数的类型注解
    • 五、总结

目录

1.认识异步编程(FastAPI)和同步编程(django)的区别 2.区分线程、携程、进程的关系 3.事件循环的了解 4.并发执行

一、什么是异步编程?异步编程和同步编程的区别?

异步编程:类似于服务的关系,在第一个路口进行任务后,将等待的时间去进行下一个任务,以此类推,不造成执行堵塞缓慢,高效完成多个任务

区别: 异步任务节省执行的时间提升执行的效率,能在短时间对多个任务进行有效的完成 同步编程就是一步一步来,等第一个任务完成之后再去执行下一个任务,效率比较低

二、异步编程的使用步骤

1.了解语法以及格式

1.async def:定义一个协程函数,调用它返回一个协程对象,不会立即执行函数体。

  • await:只能在 async def 内部使用,表示挂起当前协程,等待一个异步操作完成,在此期间事件循环可以去执行其他任务。
  • 2.代码实例展示

    下面是一个简单的 FastAPI 异步端点示例,它定义了一个 GET 路由 /hello/{name},接收一个路径参数 name,并异步返回一个 JSON 响应:

    from fastapi import FastAPI

    app = FastAPI()

    @app.get("/hello/{name}")
    async def say_hello(name: str):
    """异步问候端点"""
    return {"message": f"Hello {name}"}

    代码说明:

    • @app.get("/hello/{name}"):使用装饰器定义一个处理 GET 请求的路由,路径中包含一个参数 {name}。
    • async def say_hello(name: str)::使用 async def 声明一个异步的协程函数。当该端点被调用时,FastAPI 会将其放入事件循环中执行,而不会阻塞其他请求。
    • return {"message": f"Hello {name}"}:函数返回一个字典,FastAPI 会自动将其转换为 JSON 格式的响应。

    三、什么是进程,线程,协程,三者之间的关系是什么

  • 进程 操作系统资源分配的最小单位(独立占用内存、CPU 时间片等系统资源),进程之间完全隔离,通信成本极高,比如浏览器、微信各自都是独立进程。
  • 线程 进程内CPU 调度执行的最小单位,共享所属进程的全部资源,线程间通信简单、切换开销远小于进程;一个进程至少包含 1 个主线程,多线程适合 IO 密集型场景,受操作系统调度管控。
  • 协程 又称微线程,是用户态层面的轻量级执行单元,由代码逻辑调度、不依赖操作系统内核,切换开销远低于线程;在单线程内实现异步并发,规避了多线程的 GIL 竞争、线程切换开销问题,Python 异步编程大量使用。 二、层级从属关系 进程 > 线程 > 协程 一个进程可以包含多个线程; 一个线程内部可以运行多个协程; 进程是容器,线程跑在进程里,协程跑在线程里。
  • 适用场景 1.多进程:CPU 密集型计算,突破单核限制 2.多线程:阻塞 IO 密集型任务(文件读写、网络请求) 3.协程:高并发 IO 场景(后端接口、爬虫),实现超高并发

    四、事件循环

    事件循环是异步编程的核心机制,它是一个无限循环,负责调度和执行所有的异步任务。下面通过一个模拟文件下载的示例来演示事件循环如何工作:

    import asyncio
    import time

    async def download(file: str, duration: int):
    """模拟异步下载任务"""
    print(f"开始下载 {file},预计 {duration} 秒")
    await asyncio.sleep(duration) # 模拟耗时操作
    print(f"{file} 下载完成")
    return f"{file} 内容"

    async def main():
    """主协程函数,并发执行多个下载任务"""
    start = time.time()

    # 使用 asyncio.gather 并发执行多个异步任务
    results = await asyncio.gather(
    download("A.mp4", 3),
    download("B.pdf", 2),
    download("C.txt", 1)
    )

    end = time.time()
    print(f"总耗时: {end – start:.2f} 秒")
    print(f"下载结果: {results}")

    if __name__ == "__main__":
    # 启动事件循环并运行主协程
    asyncio.run(main())

    代码说明:

    • async def download(): 定义一个模拟下载的协程函数,使用 await asyncio.sleep(duration) 模拟耗时操作。
    • async def main(): 主协程函数,使用 asyncio.gather() 并发执行三个下载任务。
    • asyncio.gather(): 并发运行多个协程,等待所有任务完成并返回结果列表。
    • asyncio.run(main()): 启动事件循环并运行主协程,这是运行异步程序的推荐方式。

    执行结果分析: 三个下载任务会并发执行,总耗时约等于最长的任务时间(3秒),而不是各个任务时间的总和(6秒)。这体现了异步编程的高效性:当一个任务等待时,事件循环会切换到其他可执行的任务。

    五、FastAPI路径参数的类型注解

    在这里插入图片描述这是对fastapi里面的参数内容的关键词的一个展示,想对应什么就去用什么去指定然后自己设置默认值

    下面是展示 在这里插入图片描述 在这里插入图片描述 设置最大值最小值问题 在这里插入图片描述 后端用path设置最大最小值用于前端判定

    以下是成功的情况 在这里插入图片描述 以下是失败的案例: 在这里插入图片描述 注意我画红圈的位置,这里是我们提前配好的后端每页不能超过多少值然后进行的一个错误判断

    五、总结

    FastAPI 路径参数的类型注解和验证功能为 API 开发提供了强大的类型安全和数据校验能力:

  • 丰富的类型注解:FastAPI 支持多种内置类型(如 int、str、float、bool)和 Pydantic 模型,能够自动进行类型转换和验证。

  • 参数验证:通过 Path、Query、Body 等专用类,可以轻松设置参数的约束条件,如:

    • 数值范围(ge、le、gt、lt)
    • 字符串长度限制(min_length、max_length)
    • 正则表达式匹配(regex)
    • 枚举值限制
  • 错误处理:当请求参数不符合验证规则时,FastAPI 会自动返回详细的错误信息(如示例中的页码超出最大值错误),帮助客户端快速定位问题。

  • 前后端协作:后端通过路径参数设置的最大最小值等约束,可以直接用于前端的数据验证,确保数据的一致性和安全性。

  • 在实际开发中,合理使用 FastAPI 的类型注解和验证功能,可以大大减少手动校验代码,提高开发效率,同时保证 API 的健壮性和可维护性。

    赞(0)
    未经允许不得转载:171主机测评 » FastAPI了解入门
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址