FastAPI 快速入门

FastAPl.png

FastAPI framework, high performance, easy to learn, fast to code, ready for production

FastAPI框架,高性能,易于学习,快速编码,准备投入生产。

文档入口: https://fastapi.tiangolo.com.

框架源码: https://github.com/tiangolo/fastapi.


FastAPI是一个现代的、快速的(高性能的)web框架,用于基于标准Python类型提示用Python 3.6+构建api。

主要特点如下:

  • :非常高的性能,与NodeJSGo(感谢Starlette和Pydantic)。可用的最快的Python框架之一

  • 快速编码: 提高开发速度约200%到300% 。

  • 减少bug : 减少约40%的人为(开发人员)错误。

  • 直观: 伟大的编辑器的支持,完成无处不在,更少的时间调试。

  • 容易: 设计是为了便于使用和学习。减少阅读文档的时间。

  • : 最小化代码重复。每个参数声明的多个特性。更少的错误。

  • 健壮: 获得生产就绪代码。自动交互文档。

  • 基于标准的: 基于(并完全兼容)api的开放标准:OpenAPI(以前称为Swagger)和JSON模式

Typer, the FastAPI of CLIs

如果您正在构建一个在终端中使用的CLI应用程序,而不是web API,请查看Typer

开发环境

  • Python 3.6+版本

  • FastAPI 由以下两大“大牛”支持者:

安装

pip install fastapi

您还需要一个ASGI服务器,用于生产,如UvicornHypercorn

pip install uvicorn

Demo例子

新建文件main.py
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: str = None):
    return {"item_id": item_id, "q": q}

️如果你的代码使用 async / await, 使用 async def:

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: str = None):
    return {"item_id": item_id, "q": q}

运行(本地服务器)

uvicorn main:app --reload

命令解析:

  • 命令uvicorn main:app指的是:

    • main: 文件main.py (Python“模块”).
    • app: 在main.py中使用app = FastAPI()创建的对象。
    • --reload: 在代码更改后重新启动服务器。这样做只是为了开发方便。
    • 可以自行输入uvicorn --help 查看命令使用的方法。

测试功能

打开浏览器 复制它:http://127.0.0.1:8000/items/5?q=somequery.

您将看到JSON响应如下:

{"item_id": 5, "q": "somequery"}

你已经创建了一个API:

  • 在路径//items/{item_id}中接收HTTP请求。

  • 这两条路径都采用GET操作(也称为HTTP方法)。

  • path: /items/{item_id}有一个路径参数item_id,它应该是一个整数。

  • path /items/{item_id}有一个可选的str查询参数q

交互式API文档

那么,现在改变地址为:[http://127.0.0.1:8000/docs]
(http://127.0.0.1:8000/docs).

index-01-swagger-ui-simple.png

你会看到自动化的用于交互的API文档(由Swagger UI提供):

其他的API文档

现在,转到http://127.0.0.1:8000/redoc

你会看到另一个自动文档(由ReDoc提供):

index-02-redoc-simple.png

进阶版-例子(Example)

现在修改文件main.py,以便从PUT请求接收主体。

使用标准Python类型声明主体,这得益于Pydantic

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: 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命令)。

进阶版-交互式文档

现在,前往http://127.0.0.1:8000/docs

  • 交互式API文档将自动更新,包括新的主体:
index-03-swagger-02.png
  • 点击“Try it out”按钮,可以填写参数,直接与API交互:
index-04-swagger-03.png
  • 然后点击“Execute”按钮,用户界面将与您的API进行通信,发送参数,获取结果并显示在屏幕上:
index-05-swagger-04.png

进阶版-其他可选的API文档

然后现在,转到:http://127.0.0.1:8000/redoc

  • 文档还将反映新的查询参数和主体:
index-06-redoc-02.png

知识回顾

总之,只需将参数、主体等类型声明为函数参数,使用标准的现代Python类型就可以做到这一点。

您不必学习新的语法、特定库的方法或类,等等。

只需要标准的Python 3.6+版本。

  • 比如,一个int类型
item_id: int

或者对于更复杂的Item模型:

item: Item

..有了这种声明,你就可以这样:

  • 编辑器支持,包括:

    • 智能完成部分代码

    • 类型检查

  • 验证数据:

    • 当数据无效时自动清除错误

    • 甚至对深度嵌套的JSON对象进行验证

  • 输入数据的转换: 从PC端到Python数据和类型的转换

    • JSON

    • Path参数

    • Query参数

    • Cookies - 缓存信息

    • Headers - 请求头

    • Forms - 表单

    • Files - 文件

  • 输出数据的转换: 从Python数据和类型转换为PC端数据(JSON格式):

    • 转换Python类型(strintfloatboollist等)

    • datetime对象

    • 对象UUID

    • 数据库模型

    • 更多

  • 自动化交互式API文档,包括2个交互式文档web接口:

    • Swagger UI

    • ReDoc

回到前面的代码示例,FastAPI会执行以下操作:

  • 验证GETPUT请求的路径中是否有item_id

  • 验证item_id的类型为int,以用于GETPUT请求。

  • 如果不是,客户端将看到一个有用的、明显的错误。

  • 检查是否有一个名为q的可选查询参数(如http://127.0.0.1:8000/items/foo?q=somequery)用于获取请求。

  • 由于q参数是用= None声明的,所以它是可选的。

  • 如果没有None,它将是必需的(就像PUT中的主体一样)。

  • 对于PUT请求到/items/{item_id},将body读取为JSON:

  • 检查它是否有一个必需的属性名,该属性名应该是str。

  • 检查它的required属性price必须是一个浮点数。

  • 检查它是否有一个可选属性is_offer,如果存在,它应该是一个bool

  • 所有这些也适用于深度嵌套的JSON对象。

  • 自动将其转换为JSON

  • OpenAPI记录所有可以使用的东西:

  • 交互式文档系统。

  • 自动化客户端代码生成系统,适用于多种语言。

  • 直接提供2个交互式文档web接口。


我们只是学到了一些最基础最表面的东西,但是您已经了解了它是如何工作的。

你可以尝试着改变某一些行的代码:

return {"item_name": item.name, "item_id": item_id}

从以下这个:

... "item_name": item.name ...

到这些:

... "item_price": item.price ...

…看看你的编辑器将如何自动完成这些属性,并知道他们的类型:

有关包含更多特性的更完整示例,请参阅 教程-用户指南

本教程 -- 用户指南包括:
  • 来自不同地方的参数声明如下:headers, cookies, form fields 以及 files
  • 如何将validation constraints设置为maximum_lengthregex
  • 一个非常强大和容易使用的依赖注入系统
  • 安全性和身份验证,包括使用JWT令牌HTTP基本验证支持OAuth2
  • 更高级(但同样简单)的技术,用于声明深度嵌套JSON模型(Pydantic的强力支持)。
  • 许多额外的功能(感谢Starlette)作为:
    • WebSockets
    • GraphQL
    • 基于requestpytest的非常简单的测试
    • CORS
    • Cookie Sessions - 会话层
    • …和更多。

性能 (Performance)

独立的TechEmpower基准测试显示,在Uvicorn下运行的FastAPI应用程序是可用的最快的Python框架之一,仅低于StarletteUvicorn本身(由FastAPI内部使用)。(*)

要更多地了解它,请参阅“基准测试”一节。


可选依赖(Optional Dependencies)

使用Pydantic:

  • ujson - 用于更快的JSON“解析”。

  • email_validator - 用于电子邮件验证。

使用Starlette:

  • request -- 如果您想要使用TestClient,那么这是必需的。

  • aiofiles—如果您想使用FileResponseStaticFiles,则必须使用aiofiles

  • jinja2 - 如果你想使用默认的模板配置,jinja2是必须的。

  • python-multipart如果希望支持表单“解析”,那么使用request.form()是必需的。

  • itsdangerous它是危险的——需要SessionMiddleware(会话中间件)支持。

  • pyyaml -需要Starlette的SchemaGenerator支持(您可能不需要FastAPI)。

  • graphere——GraphQLApp支持所需。

  • ujson - 如果您想使用UJSONResponse,则必须使用ujson

FastAPI / Starlette使用:

  • uvicorn - 用于加载和服务您的应用程序的服务器。

  • orjson - 如果您想使用ORJSONResponse,则必须使用orjson。

您可以用pip install fastapi[all]安装所有这些东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容