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]
许可证
这个项目是根据麻省理工学院的许可条款授权的。