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 模型来声明请求体,并能够获得它们所具有的所有能力和优点。

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

相关推荐
黄俊懿1 分钟前
【深入理解SpringCloud微服务】Sentinel功能详解
后端·spring·spring cloud·微服务·中间件·架构·sentinel
运维&陈同学5 分钟前
【zookeeper04】消息队列与微服务之zookeeper客户端访问
linux·后端·微服务·zookeeper·云原生·消息队列·云计算
2401_854391081 小时前
企业OA管理系统:Spring Boot技术架构与应用
spring boot·后端·架构
潜洋1 小时前
Spring Boot教程之七: Spring Boot –注释
java·spring boot·后端·注释
不能只会打代码1 小时前
深入讲解Spring Boot和Spring Cloud,外加图书管理系统实战!
spring boot·后端·spring cloud
一见1 小时前
go编程中yaml的inline应用
开发语言·后端·golang
程序猿进阶1 小时前
Otter 安装流程
java·数据库·后端·mysql·数据同步·db·otter
水w2 小时前
详细介绍HTTP与RPC:为什么有了HTTP,还需要RPC?
java·开发语言·后端·http·rpc·1024程序员节
我的运维人生2 小时前
Spring Boot应用开发深度解析与实践案例
java·spring boot·后端·运维开发·技术共享
Peter_chq2 小时前
【计算机网络】数据链路层
linux·c语言·开发语言·网络·c++·后端·网络协议