文档:https://fastapi.tiangolo.com
源代码:https://github.com/fastapi/ fastapi
fastapi是一个现代快速(高性能),网络框架,用于基于标准Python型提示,用于使用Python构建API。
关键功能是:
- 快速:非常高的性能,与Nodejs同在并进行(感谢《星际和Pydantic》)。最快的Python框架之一。
- 快速到达代码:将开发功能的速度提高约200%至300%。 *
- 较少的错误:减少约40%的人(开发人员)诱发错误。 *
- 直观:出色的编辑支持。到处完成。更少的时间调试。
- 容易:易于使用和学习。更少的时间阅读文档。
- 简短:最小化代码重复。每个参数声明中的多个功能。更少的错误。
- 强大:获取生产准备代码。使用自动交互式文档。
- 基于标准:基于(并完全兼容)API的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。
*基于内部开发团队的测试,建立生产应用程序的估计。
赞助商
其他赞助商
意见
“ […]这些天我正在使用fastapi 。[…]我实际上打算将其用于Microsoft的所有团队的ML服务。其中一些正在集成到核心Windows产品和一些办公产品中。 ”
Kabir Khan -Microsoft (参考)
“我们采用了fastapi库来催生一个可以查询以获取预测的REST服务器。[对于Ludwig] ”
Piero Molino,Yaroslav Dudin和Sai Sumanth Miryala -Uber (Ref)
“ Netflix很高兴地宣布我们的危机管理编排框架的开源发布: Dispatch ![使用fastapi ]建造””
凯文·格里森(Kevin Glisson),马克·维拉诺瓦(Marc Vilanova),森林蒙森 – Netflix (参考)
“我对fastapi感到兴奋。太有趣了! ”
Brian Okken -Python Bytes Podcast主持人(参考)
“老实说,您所建造的东西看起来超级稳固和抛光。从很多方面来说,这就是我想要拥抱的东西 – 看到某人建造它确实令人鼓舞。 ”
蒂莫西·克罗斯利(Timothy Crosley) –拥抱创作者(参考)
“如果您想学习一个现代构建REST API的框架,请查看fastapi […]它很快,易于使用且易于学习[…] ”
“我们已切换到fastapi for我们的API […]我想您会喜欢它[…] ”
Ines Montani -Matthew Honnibal-爆炸AI创始人 – Spacy Creators (Ref) – (参考)
“如果有人希望构建生产Python API,我强烈推荐fastapi 。它设计精美,易于使用且高度扩展,它已成为我们API首次开发策略的关键组成部分,并且正在推动许多自动化和服务,例如我们的虚拟TAC工程师。 ”
Deon Pillsbury -Cisco (参考)
Typer ,Clis的fastapi
如果要构建一个CLI应用程序,该应用程序用于终端而不是Web API,请查看Typer 。
Typer是fastapi的小兄弟姐妹。它的目的是成为克里斯的fastapi 。 ⌨️
要求
fastapi站在巨人的肩膀上:
- 网络零件的星条。
- 数据部分的Pydantic。
安装
创建并激活虚拟环境,然后安装fastapi :
fastapi[standard]\”
—> 100%\”>
$ pip install \" fastapi [standard] \" ---> 100%
注意:确保将“ fastapi [Standard]”放在引号中,以确保其在所有终端中工作。
例子
创建它
使用以下方式创建一个文件main.py
fastapi
app = fastapi ()
@app.get(\”/\”)
def read_root():
return {\”Hello\”: \”World\”}
@app.get(\”/items/{item_id}\”)
def read_item(item_id: int, q: Union[str, None] = None):
return {\”item_id\”: item_id, \”q\”: q}\”>
from typing import Union 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 : Union [ str , None ] = None ): return { \"item_id\" : item_id , \"q\" : q }
或使用async def …
如果您的代码使用异步 /等待,请使用async def:
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: Union[str, None] = None):
return {\”item_id\”: item_id, \”q\”: q}\”>
from typing import Union 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 : Union [ str , None ] = None ): return { \"item_id\" : item_id , \"q\" : q }
笔记:
如果您不知道,请检查“快点?”关于异步和文档中等待的部分。
运行它
使用以下方式运行服务器
fastapi dev main.py
╭────────── fastapi CLI – Development mode ───────────╮
│ │
│ Serving at: http://127.**0.*0.1:8000 │
│ │
│ API docs: http://127.**0.*0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: [\’/home/user/code/awesomeapp\’]
INFO: Uvicorn running on http://127.**0.*0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.\”>
$ fastapi dev main.py ╭────────── fastapi CLI - Development mode ───────────╮ │ │ │ Serving at: http://127.**0.*0.1:8000 │ │ │ │ API docs: http://127.**0.*0.1:8000/docs │ │ │ │ Running in development mode, for production use: │ │ │ │ fastapi run │ │ │ ╰─────────────────────────────────────────────────────╯ INFO: Will watch for changes in these directories: [\'/home/user/code/awesomeapp\'] INFO: Uvicorn running on http://127.**0.*0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [2248755] using WatchFiles INFO: Started server process [2248757] INFO: Waiting for application startup. INFO: Application startup complete.
关于命令fastapi dev main.py …
Command fastapi Dev读取您的main.py文件,检测其中的fastapi应用程序,并使用Uvicorn启动服务器。
默认情况下, fastapi Dev将从启用本地开发的自动重加加载量开始。
您可以在fastapi CLI文档中阅读有关它的更多信息。
检查一下
在http://127.**0.*0.1:8000/items/5?q= somequery上打开浏览器。
您将看到JSON响应为:
{ \"item_id\" : 5 , \"q\" : \" somequery \" }
您已经创建了一个API:
- 在路径/和 /atem /{item_id}中接收HTTP请求。
- 这两条路径都采用操作(也称为HTTP方法)。
- 路径/item /{item_id}具有一个应为int的路径参数item_id。
- 路径/项目 /{item_id}具有可选的STR查询参数q。
交互式API文档
现在访问http://127.**0.*0.1:8000/docs。
您将看到自动交互式API文档(由Swagger UI提供):
替代API文档
现在,请访问http://127.**0.*0.1:8000/redoc。
您将看到替代自动文档(由RETOC提供):
示例升级
现在,修改文件main.py以从PUT请求接收正文。
借助Pydantic,使用标准Python类型声明身体。
fastapi
from pydantic import BaseModel
app = fastapi ()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get(\”/\”)
def read_root():
return {\”Hello\”: \”World\”}
@app.get(\”/items/{item_id}\”)
def read_item(item_id: int, q: Union[str, None] = 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}\”>
from typing import Union from fastapi import fastapi from pydantic import BaseModel app = fastapi () class Item ( BaseModel ): name : str price : float is_offer : Union [ bool , None ] = None @ app . get ( \"/\" ) def read_root (): return { \"Hello\" : \"World\" } @ app . get ( \"/items/{item_id}\" ) def read_item ( item_id : int , q : Union [ str , None ] = 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 }
fastapi Dev服务器应自动重新加载。
互动API文档升级
现在访问http://127.**0.*0.1:8000/docs。
- 交互式API文档将自动更新,包括新主体:
- 单击按钮“尝试出去”,它允许您填充参数并直接与API交互:
- 然后单击“执行”按钮,用户界面将与您的API通信,发送参数,获取结果并在屏幕上显示它们:
替代API文档升级
现在,请访问http://127.**0.*0.1:8000/redoc。
- 替代文档还将反映新的查询参数和主体:
回顾
总而言之,您将参数,主体等的类型声明为函数参数。
您可以使用标准的现代Python类型来做到这一点。
您不必学习新的语法,特定库的方法或类别等。
只是标准python 。
例如,对于INT:
item_id : int
或更复杂的项目模型:
item : Item
…随着您获得的单一声明:
- 编辑支持,包括:
- 完成。
- 类型检查。
- 数据验证:
- 当数据无效时,自动且清晰的错误。
- 甚至针对深嵌套的JSON对象的验证。
- 输入数据的转换:从网络转到Python数据和类型。从:
- JSON。
- 路径参数。
- 查询参数。
- 曲奇饼。
- 标题。
- 表格。
- 文件。
- 输出数据的转换:从Python数据和类型转换为网络数据(作为JSON):
- 转换Python类型(STR,INT,Float,Bool,List等)。
- DateTime对象。
- UUID对象。
- 数据库模型。
- …还有更多。
- 自动交互式API文档,包括2个替代用户界面:
- Swagger UI。
- 重做。
回到上一个代码示例, fastapi将:
- 验证是否有一个item_id在获取和提出请求的路径中。
- 验证item_id是int type int for get和put请求。
- 如果不是这样,客户将看到一个有用的,清晰的错误。
- 检查是否有一个名为Q的可选查询参数(如http://127.**0.*0.1:8000/items/foo?q=somequery)以获取get requests。
- 由于Q参数用= none声明,因此是可选的。
- 没有任何不需要的就需要(与put的身体一样)。
- 对于将请求到 /item /{item_id}的请求,请将其读为JSON:
- 检查它具有所需的属性名称,该名称应为str。
- 检查它具有所需的属性价格,必须是浮点。
- 检查它是否具有可选的属性iS_offer,如果存在,应该是一个布尔。
- 所有这些也适用于深嵌套的JSON对象。
- 自动转换为JSON。
- 用OpenAPI记录所有内容,可以通过以下方式使用:
- 交互式文档系统。
- 许多语言的自动客户端代码生成系统。
- 直接提供2个交互式文档Web接口。
我们只是刮擦了表面,但是您已经了解了一切的工作方式。
尝试使用以下方式更改行:
return { \"item_name\" : item . name , \"item_id\" : item_id }
…从:
... \"item_name\" : item . name ...
…到:
... \"item_price\" : item . price ...
…并查看您的编辑器将如何自动完成属性并了解其类型:
有关包括更多功能的更完整的示例,请参见教程 – 用户指南。
剧透警报:教程 – 用户指南包括:
- 从其他不同位置声明参数为:标题, cookie ,表单字段和文件。
- 如何将验证约束设置为最大_length或Regex。
- 一个非常强大且易于使用的依赖注入系统。
- 安全性和身份验证,包括对JWT令牌和HTTP Basic Auth的OAuth2的支持。
- 对于宣布深嵌套的JSON模型(感谢Pydantic),更先进的技术(但同样容易)。
- GraphQL与草莓和其他库集成。
- 许多额外功能(多亏了《星条》)为:
- Websocket
- 基于HTTPX和PYTEST的非常简单的测试
- 科尔斯
- 饼干会议
- …还有更多。
表现
独立的Techempower基准测试显示了在Uvicorn下运行的fastapi应用程序是最快的Python框架之一,仅在星际和Uvicorn本身下方(由fastapi内部使用)。 (*)
要了解有关它的更多信息,请参见“基准”部分。
依赖性
fastapi取决于Pydantic和starlette。
标准依赖性
当您使用PIP安装“ fastapi [Standard]”安装fastapi时,它将随附标准的可选依赖项组:
Pydantic使用:
- 电子邮件validator-用于电子邮件验证。
由星条:
- HTTPX-如果要使用测试量,则需要。
- jinja2-如果要使用默认模板配置,则需要。
- Python -Multipart-如果要支持“解析”,则需要request.form()。
fastapi使用:
- Uvicorn-对于加载和服务您应用程序的服务器。这包括UVICORN [Standard],其中包括一些依赖性(例如UVloop),需要进行高性能服务。
- fastapi -cli [standard] – 提供fastapi命令。
- 这包括fastapi -Cloud -CLI,它允许您将fastapi应用程序部署到fastapi Cloud。
没有标准依赖性
如果您不想包含标准的可选依赖项,则可以使用PIP安装fastapi安装,而不是PIP安装“ fastapi [Standard]”。
没有fastapi -cloud -cli
如果要以标准依赖项安装fastapi ,但是没有fastapi -Cloud-CLI,则可以使用PIP安装安装“ fastapi [standard-no- fastapi -cloud-cli]”。
其他可选依赖性
您可能需要安装一些其他依赖项。
其他可选的pydantic依赖性:
- Pydantic -Settings-用于设置管理。
- pydantic-extra-types-用于与Pydantic一起使用的额外类型。
其他可选的fastapi依赖性:
- ORJSON-如果要使用OrjsonResponse,则需要。
- UJSON-如果要使用Ujsonresponse,则需要。
执照
该项目是根据MIT许可证的条款获得许可的。
