FastAPI 初体验,效率杠杠滴

前言:

写Java好久了,给自己定个小目标,下个项目使用Python做web开发,主要原因是我们的项目用户量不大,而且QPS低,所以可以在不同的业务方案切换,同时体验下Python的开发效率。

在之前的工作中使用过Django,也了解过Flask,不过在其他项目中看到同事使用FastAPI ,今天就体验下,下次直接用在项目中。

1、官网信息

官方文档:FastAPI

文档: fastapi.tiangolo.com

源码:GitHub - tiangolo/fastapi: FastAPI framework, high performance, easy to learn, fast to code, ready for production

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之。
  • 高效编码:提高功能开发速度约 200% 至 300%。*
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。*
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

2、环境安装

pip install fastapi -i pypi.tuna.tsinghua.edu.cn/simple pip install "uvicorn[standard]" -i pypi.tuna.tsinghua.edu.cn/simple 直接使用官方的命令,总是timeout,所以直接切换到国内的源,

安装其他的包 也可以用这个方式哦

3、写个demo

我使用的Python是3.8,pycharm社区版。

直接创建一个Python项目就行,然后执行上一步的安装包

拷贝下面的代码到main.py

python 复制代码
from typing import Union
from fastapi import Header, FastAPI
from fastapi import FastAPI
import uvicorn
 
# 类似于 app = Flask(__name__)
app = FastAPI()
 
 
# 绑定路由和视图函数
@app.get("/")
async def index():
    return {"name": "香菜"}
# 绑定路由和视图函数
@app.get("/testcookie")
async def index(token: Union[str, None] = Header(default=None)):
    return {"name": token}
 
# 在 Windows 中必须加上 if __name__ == "__main__"
# 否则会抛出 RuntimeError: This event loop is already running
if __name__ == "__main__":
    # 启动服务,因为我们这个文件叫做 main.py
    # 所以需要启动 main.py 里面的 app
    # 第一个参数 "main:app" 就表示这个含义
    # 然后是 host 和 port 表示监听的 ip 和端口
    uvicorn.run("main:app", host="0.0.0.0", port=5555)

运行之后

4、关注的几个技术点

4.1 路径参数数据接收

这个还是挺简单的

python 复制代码
from fastapi import FastAPI
 
app = FastAPI()
 
 
@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

4.2 查询参数数据接收

声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数

python 复制代码
from fastapi import FastAPI
 
app = FastAPI()
 
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
 
 
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

查询字符串是键值对的集合,这些键值对位于 URL 的 ? 之后,并以 & 符号分隔。

例如,在以下 url 中:

http://127.0.0.1:8000/items/?skip=0&limit=10

...查询参数为:

skip:对应的值为 0 limit:对应的值为 10 由于它们是 URL 的一部分,因此它们的"原始值"是字符串。

4.3 post 数据接收

定义数据模型,当一个模型属性具有默认值时,它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性。

python 复制代码
from typing import Union
 
from fastapi import FastAPI
from pydantic import BaseModel
 
 
class Item(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: Union[float, None] = None
 
 
app = FastAPI()
 
 
@app.post("/items/")
async def create_item(item: Item):
    return item

4.4 header数据接收
from typing import Union
 
from fastapi import FastAPI, Header
 
app = FastAPI()
 
 
@app.get("/items/")
async def read_items(user_agent: Union[str, None] = Header(default=None)):
    return {"User-Agent": user_agent}

4.5 cookie数据接收

python 复制代码
from typing import Union
 
from fastapi import Cookie, FastAPI
 
app = FastAPI()
 
 
@app.get("/items/")
async def read_items(ads_id: Union[str, None] = Cookie(default=None)):
    return {"ads_id": ads_id}

5、总结

5.1 没有使用门槛 fastAPI 对于我来说并没有太多的新鲜感,大部分的使用方式也和Springboot很像,没什么新鲜感,带来的好处就是没有使用门槛。

5.2 开发效率 可能对于我来说还真没有多少提升,但是还是想试一试

5.3 劣势 看到fastAPI使用了Pydantic 模型来声明请求体,并能够获得它们所具有的所有能力和优点。

这个需要学习,也不知道会有多少学习成本,不熟。

相关推荐
间彧几秒前
Redis缓存穿透、缓存雪崩、缓存击穿详解与代码实现
后端
摸鱼的春哥4 分钟前
【编程】是什么编程思想,让老板对小伙怒飙英文?Are you OK?
前端·javascript·后端
Max81244 分钟前
Agno Agent 服务端文件上传处理机制
后端
调试人生的显微镜1 小时前
苹果 App 怎么上架?从开发到发布的完整流程与使用 开心上架 跨平台上传
后端
顾漂亮1 小时前
Spring AOP 实战案例+避坑指南
java·后端·spring
间彧1 小时前
Redis Stream相比阻塞列表和发布订阅有哪些优势?适合什么场景?
后端
间彧1 小时前
Redis阻塞弹出和发布订阅模式有什么区别?各自适合什么场景?
后端
苏三说技术1 小时前
统计接口耗时的6种常见方法
后端
SimonKing2 小时前
Mybatis-Plus的竞争对手来了,试试 MyBatis-Flex
java·后端·程序员
我命由我123452 小时前
PDFBox - PDFBox 加载 PDF 异常清单(数据为 null、数据为空、数据异常、文件为 null、文件不存在、文件异常)
java·服务器·后端·java-ee·pdf·intellij-idea·intellij idea