FastAPI的基础使用
1.什么是FastAPI简单来说:FastAPI 是 Python 用来快速写后端接口的 Web 框架。 专门用来做给前端页面、小程序、APP 提供数据接口接收请求、处理逻辑、返回 JSON 数据。相比其python的另外一个django框架,它最大的有点就是非常的快DjangoDRF大而全自带后台 admin、ORM、表单、权限全套适合大型后台管理系统默认是同步写法并发弱一点配置繁琐。FastAPI轻量化、主打接口开发没有多余冗余功能主打简洁、异步、自动文档、开箱即用适合微服务、小程序接口、爬虫后端、高并发服务。2.python的异步编程有异步那么肯定就会有同步,这两个有什么区别呢?假如我是一个奶茶店的店员这里就相当于我们程序里面的一个线程在同步模式下,客人A点了一杯奶茶,这杯奶茶要煮3分钟,你就要站在奶茶机前干等3分钟,B,C,D客人都只能排队,这就是我们常说的I/O线程阻塞,CPU大部分时间都在空转,没有干实事但是在异步模式下,你给机器定好了闹钟就去接待别人了,机器想了之后在回头收尾,这样一个人就可以处理好几个人的问题,效率会比同步的要高上许多.Web服务的大多数时间都花在了等上面,等数据库,网络,磁盘等,而不是在算,把这些等待起来的时间利用起来去处理别的请求,这样我们的并发能力就会大幅度的提升,这就是我们异步的价值所在.3.核心语法:async/awaitasync def定义一个协程函数调用它返回一个协程对象不会立即执行函数体。await只能在async def内部使用表示挂起当前协程等待一个异步操作完成在此期间事件循环可以去执行其他任务。4.FastAPI 快速入门在我们的python里新建我们的项目,选着FsatAPI然后在我们的环境这里选着我们的已经有都虚拟环境,如果没有的话可用点击生成我们的新的会自动生成我们的一个虚拟环境。在python里面创建有一个好处,他会直接给我们安装我们的依赖,如果是我们使用命令创建的项目那我们就需要使用这个命令来安装我们的一个依赖pip install fastapi uvicorn[standard]在这里启动方式有两种一种是在IDE里直接运行另一种就是在我们的终端里执行命令:uvicorn main:app --reload期中mian.app的函数是在我们的mani.py类文件中找到名为app的FastAPI对象,访问成功我们可用看到会给我们返回一个我们的本地端口号http://127.0.0.1:8000复制这个端口号去我们的浏览器中,能看到接口返回的一个JSON这是FastAPI最开始给我们默认生成的一个接口使用http://127.0.0.1:8000/docs是自动生成Swagger UI 交互式文档。你可以在这里直接测试接口,为什么 FastAPI 能自动生成文档之所以能自动生成文档,考的就是函数定义的python的类型提示,FastAPI会读取这些类型信息生成OpenAPI规范,在渲染成可以交互的页面.5.什么是参数路径参数是URL路径中动态调整的部分,用于标识具体的资源/items/11是路径参数item_id的值/users/100100是路径参数user_id的值FastAPI会自动提取路径中的对应值并传递给路由处理函数。基础路径参数实现例如/items/5中的5就表示获取 ID 为 5 的商品。items_db [ {id: 1, name: iphone}, {id: 2, name: ipad}, {id: 3, name: mac}, {id: 4, name: watch}, {id: 5, name: airpods} ] app.get(/items/{id}) async def get_item_by_id(id: int): 路径参数:商品ID :return: print(f根据商品ID:{id}查询) for item in items_db: if item[id] id: return {code: 1, message: 查询成功, data: item} return {code: 0, message: 查询失败, data: None}核心优势:无需手动写数据类型FastAPI自动完成类型校验.6.路由是什么路由Route说白了就是请求路径URL和后端处理函数之间的映射关系用户访问哪个地址就应该执行哪个函数、返回什么内容这个地址到函数的连接就叫路由。而app.get(/xxx)这一行就是所谓的装饰器Decorator。装饰器的作用是给下面的函数附加额外行为在 FastAPI 里这个额外行为就是把这个函数注册成一个 API 接口指定它的 URL 路径和请求方法GET/POST/PUT/DELETE。一句话概括装饰器 这个函数被 FastAPI 接管变成了一个 API 接口。7.进阶校验用 Path 类限定取值范围基础的类型注解只能校验类型对不对没法限制数值范围比如商品 ID 必须在 1 到 1000 之间。这时候需要请出Path类它支持ge大于等于、le小于等于、gt大于、lt小于还能加title、description、alias这些用于文档展示的元信息# 路径参数高级校验示例 from fastapi import Path # 数值范围校验ID必须0且≤1000 app.get(/products/{product_id}, summary数值范围校验) def read_product( product_id: int Path( gt0, # 大于0不包含0 le1000, # 小于等于1000 description产品ID必须大于0且≤1000 ) ): return {product_id: product_id, message: 参数校验通过} # 浮点参数校验价格必须≥0.01 app.get(/price/{price}, summary浮点参数校验) def check_price( price: float Path( ge0.01, description商品价格最低0.01元 ) ): return {price: price, message: 价格合法}测试一下就能感受到它的好处访问/products/0会因为不满足gt0而报错访问/products/1001会因为超过le1000报错/price/0.001也会因为低于ge0.01被拦下。所有这些校验逻辑都不需要自己手写 if 判断声明式的写法既省代码又不容易漏掉边界情况。