fastapi

2025-12-11 0 493

fastapi框架高性能,易于学习,快速地编码,准备生产

测试


文档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许可证的条款获得许可的。

下载源码

通过命令行克隆项目:

git clone https://github.com/fastapi/fastapi.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 fastapi https://www.zuozi.net/34469.html

AndroidOfferKiller
上一篇: AndroidOfferKiller
ruff
下一篇: ruff
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务