FastAPI框架,高性能,易学,编码速度快,可投入生产
文档:https://fastapi.tiangolo.com
源代码:https://github.com/tiangolo/fastapi
FastAPI是一种现代、快速(高性能)的Web框架,用于使用Python 3.6+基于标准Python类型提示构建API
主要功能包括:
- 快地:非常高的性能,可与节点JS和去(多亏了斯塔莱特和皮丹蒂克)One of the fastest Python frameworks available
- 快速编码:提高功能开发速度约200%至300%。*
- 更少的错误:减少约40%的人为(开发人员)引起的错误。*
- 直观:强大的编辑支持。无处不在的完成度。调试时间更短
- 简单易懂:设计成易于使用和学习。减少阅读文档的时间
- 短的:最大限度地减少代码重复。来自每个参数声明的多个功能。更少的错误
- 健壮:获取可投入生产的代码。使用自动交互文档
- 基于标准的:基于(并完全兼容)API开放标准:OpenAPI(以前称为Swagger)和JSON Schema
*基于对内部开发团队、构建生产应用程序的测试进行估计
意见
“[.]我在用FastAPI这几天有一吨多。[.]实际上我正计划把它用在我所有团队的微软的ML服务他们中的一些人正在融入核心窗口产品和一些办公室产品“
“我们采用了FastAPI库以派生睡觉可以查询获取的服务器预测[路德维希]“
“Netflix我很高兴地宣布我们的危机管理编排框架:派单好了![使用以下组件构建FastAPI]“
“我欣喜若狂FastAPI太好玩了!“
“老实说,你建造的东西看起来非常坚固和精美。在很多方面,这是我想要的拥抱一下是-看到有人建造这样的建筑真的很鼓舞人心“
“如果你想学一门现代框架要构建睡觉API,请查看FastAPI[.]它快速、易用、易学。“
“我们已经切换到FastAPI为了我们的API接口[.]我想你会喜欢的。“
要求
Python 3.6+
FastAPI站在巨人的肩膀上:
安装
$ pip install fastapi
---> 100%
您还需要一台ASGI服务器用于生产,例如Uvicorn或Hypercorn
$ pip install uvicorn[standard]
---> 100%
示例
创建它
- 创建文件
main.py
使用:
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文档将自动更新,包括新的Body:
- 点击[试用]按钮,即可填写参数,直接与接口交互:
- 然后点击“执行”按钮,用户界面将与您的API进行通信,发送参数,得到结果并显示在屏幕上:
备用API文档升级
现在,请转到http://127.0.0.1:8000/redoc
- 替代文档还将反映新的查询参数和正文:
概述
总而言之,您声明一次作为函数参数的参数类型、正文等
您可以使用标准的现代Python类型来实现这一点
您不必学习新语法、特定库的方法或类等
只是标准的Python 3.6+
例如,对于int
:
item_id: int
或者对于更复杂的Item
型号:
item: Item
有了这一份声明,你就会得到:
- 编辑器支持,包括:
- 完成
- 类型检查
- 数据验证:
- 数据无效时自动清除错误
- 即使是针对深度嵌套的JSON对象的验证也是如此
- 输入数据的转换:从网络到Python数据和类型的转换。阅读自:
- JSON
- 路径参数
- 查询参数
- 曲奇饼
- 标题
- 表格
- 文件
- 输出数据转换:从Python数据和类型转换为网络数据(如JSON):
- 转换Python类型(
str
,int
,float
,bool
,list
等) datetime
对象UUID
对象- 数据库模型
- 还有更多
- 转换Python类型(
- 自动交互式API文档,包括2个替代用户界面:
- 大摇大摆的UI
- 复单
回到前面的代码示例,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使用:
ujson
-用于更快的JSON“解析”email_validator
-用于电子邮件验证
由Starlette使用:
requests
-如果要使用TestClient
aiofiles
-如果要使用,则为必填项FileResponse
或StaticFiles
jinja2
-如果要使用默认模板配置,则为必填项python-multipart
-如果您想支持表单“解析”,则为必填项,带有request.form()
itsdangerous
-需要用于SessionMiddleware
支持pyyaml
-Starlette的必填项SchemaGenerator
支持(FastAPI可能不需要)graphene
-需要用于GraphQLApp
支持ujson
-如果要使用,则为必填项UJSONResponse
由FastAPI/Starlette使用:
您可以使用以下命令安装所有这些组件pip install fastapi[all]
许可证
这个项目是根据麻省理工学院的许可条款授权的。