前言:
写Java好久了,给自己定个小目标,下个项目使用Python做web开发,主要原因是我们的项目用户量不大,而且QPS低,所以可以在不同的业务方案切换,同时体验下Python的开发效率。
在之前的工作中使用过Django,也了解过Flask,不过在其他项目中看到同事使用FastAPI ,今天就体验下,下次直接用在项目中。
1、官网信息
官方文档:FastAPI
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项目就行,然后执行上一步的安装包
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 模型来声明请求体,并能够获得它们所具有的所有能力和优点。
这个需要学习,也不知道会有多少学习成本,不熟。