
FastAPI框架,高性能,易学,编码速度快,可投入生产
文档:https://fastapi.tiangolo.com
源代码:https://github.com/tiangolo/fastapi
FastAPI是一种现代、快速(高性能)的Web框架,用于使用Python 3.6+基于标准Python类型提示构建API
主要功能包括:
*基于对内部开发团队、构建生产应用程序的测试进行估计
意见
“[.]我在用FastAPI这几天有一吨多。[.]实际上我正计划把它用在我所有团队的微软的ML服务他们中的一些人正在融入核心窗口产品和一些办公室产品“
“我们采用了FastAPI库以派生睡觉可以查询获取的服务器预测[路德维希]“
皮耶罗·莫利诺,雅罗斯拉夫·杜丁和赛苏曼斯·米利亚拉-
优步(Uber)(ref)
“Netflix我很高兴地宣布我们的危机管理编排框架:派单好了![使用以下组件构建FastAPI]“
凯文·格利森,马克·维拉诺瓦,福里斯特·蒙森-
Netflix(ref)
“我欣喜若狂FastAPI太好玩了!“
“老实说,你建造的东西看起来非常坚固和精美。在很多方面,这是我想要的拥抱一下是-看到有人建造这样的建筑真的很鼓舞人心“
“如果你想学一门现代框架要构建睡觉API,请查看FastAPI[.]它快速、易用、易学。“
“我们已经切换到FastAPI为了我们的API接口[.]我想你会喜欢的。“
要求
Python 3.6+
FastAPI站在巨人的肩膀上:
安装
$ pip install fastapi
---> 100%
您还需要一台ASGI服务器用于生产,例如Uvicorn或Hypercorn
$ pip install uvicorn[standard]
---> 100%
示例
创建它
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
或使用async def
如果您的代码使用async/await,使用async def:
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
注意事项:
如果您不知道,请查看“赶时间?”部分关于async and await in the docs
运行它
使用以下命令运行服务器:
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
关于命令uvicorn main:app --reload
该命令uvicorn main:app指的是:
main:文件main.py(Python“模块”)
app:在中创建的对象main.py用这条线app = FastAPI()
--reload:使服务器在代码更改后重新启动。这样做只是为了发展。
检查一下
在以下位置打开您的浏览器http://127.0.0.1:8000/items/5?q=somequery
您将看到JSON响应为:
{"item_id": 5, "q": "somequery"}
您已经创建了一个API,该API:
- 中接收HTTP请求。路径
/和/items/{item_id}
- 两者都有路径拿走
GET运营(也称为HTTP方法:)
- 这个路径
/items/{item_id}有一个路径参数item_id这应该是一个int
- 这个路径
/items/{item_id}有一个可选的str查询参数q
交互式API文档
现在转到http://127.0.0.1:8000/docs
您将看到自动交互API文档(由提供Swagger UI):

替代API文档
现在,请转到http://127.0.0.1:8000/redoc
您将看到替代自动文档(由提供ReDoc):

示例升级
现在修改该文件main.py接收来自PUT请求
使用标准Python类型声明Body,这要归功于Pydatics
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Optional[bool] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
服务器应自动重新加载(因为您添加了--reload发送到uvicorn上述命令)
Interactive API文档升级
现在转到http://127.0.0.1:8000/docs


- 然后点击“执行”按钮,用户界面将与您的API进行通信,发送参数,得到结果并显示在屏幕上:

备用API文档升级
现在,请转到http://127.0.0.1:8000/redoc

概述
总而言之,您声明一次作为函数参数的参数类型、正文等
您可以使用标准的现代Python类型来实现这一点
您不必学习新语法、特定库的方法或类等
只是标准的Python 3.6+
例如,对于int:
或者对于更复杂的Item型号:
有了这一份声明,你就会得到:
- 编辑器支持,包括:
- 数据验证:
- 数据无效时自动清除错误
- 即使是针对深度嵌套的JSON对象的验证也是如此
- 输入数据的转换:从网络到Python数据和类型的转换。阅读自:
- JSON
- 路径参数
- 查询参数
- 曲奇饼
- 标题
- 表格
- 文件
- 输出数据转换:从Python数据和类型转换为网络数据(如JSON):
- 转换Python类型(
str,int,float,bool,list等)
datetime对象
UUID对象
- 数据库模型
- 还有更多
- 自动交互式API文档,包括2个替代用户界面:
回到前面的代码示例,FastAPI将:
- 验证是否存在
item_id在用于的路径中GET和PUT请求
- 验证
item_id类型为int为GET和PUT请求
- 检查是否存在名为的可选查询参数
q(如图所示http://127.0.0.1:8000/items/foo?q=somequery)用于GET请求
- 作为
q参数是用= None,它是可选的
- 如果没有
None这将是必需的(就像在具有以下情况的情况下的身体一样PUT)
- 为
PUT请求/items/{item_id},将正文读作JSON:
- 检查它是否具有必需的属性
name这应该是一个str
- 检查它是否具有必需的属性
price那一定是一个float
- 检查它是否具有可选属性
is_offer,那应该是一个bool,如果存在
- 所有这些也适用于深度嵌套的JSON对象
- 自动从JSON转换为JSON或自动转换为JSON
- 使用OpenAPI记录可由以下人员使用的所有内容:
- 交互式文档系统
- 自动客户端代码生成系统,适用于多种语言
- 直接提供2个交互式文档web界面
我们只是触及了皮毛,但您已经对它的工作原理有了大致的了解
尝试使用以下命令更改行:
return {"item_name": item.name, "item_id": item_id}
出发地:
... "item_name": item.name ...
收件人:
... "item_price": item.price ...
并查看您的编辑器将如何自动完成属性并了解其类型:

有关包含更多功能的更完整示例,请参阅Tutorial – User Guide
剧透警报:教程-用户指南包括:
- 的声明参数从其他不同的地方,如:标题,曲奇饼,表单域和文件
- 如何设置验证约束作为
maximum_length或regex
- 一款功能非常强大且易于使用的依赖项注入系统
- 安全性和身份验证,包括支持OAuth2使用JWT代币和HTTP Basic身份验证
- 更高级(但同样简单)的声明技术深度嵌套的JSON模型(多亏了皮丹蒂克)
- 许多额外功能(感谢Starlette),如:
- WebSockets
- 图形QL
- 极其简单的测试,基于
requests和pytest
- CORS
- Cookie会话
- 还有更多
性能
独立TechEmpower基准显示FastAPI在Uvicorn AS下运行的应用程序one of the fastest Python frameworks available,仅低于Starlette和Uvicorn本身(由FastAPI内部使用)。(*)
要了解更多信息,请参阅小节Benchmarks
可选依赖项
由Pydtic使用:
由Starlette使用:
由FastAPI/Starlette使用:
您可以使用以下命令安装所有这些组件pip install fastapi[all]
许可证
这个项目是根据麻省理工学院的许可条款授权的。