徽标取自Github FastAPI 存储库
FastAPI是一个用Python编程语言编写的相对较新的Web框架,用于基于Python 3.6+的新功能(例如:类型提示,本机异步(asyncio) ) 除其他外,FastAPI与OpenAPI架构紧密集成,并通过Swagger和ReDoc为您的API自动生成文档
FastAPI基于Starlette和Pydantic 。
Starlette是用于编写Web应用程序的ASGI微框架。
Pydantic-一个用于基于Python类型提示来解析和验证数据的库。
他们对FastAPI说些什么?
“ [...]最近几天,我经常使用FastAPI。[...]我绝对计划将其用于Microsoft团队的所有ML服务。其中一些集成到Windows和某些Office产品中。”
Kabir Khan- 微软 ( 参考 )
“如果您想学习另一种编写REST API的框架,请查看FastAPI [...],它快速,易于使用和学习。[...]
“现在我们将FastAPI用于我们的API [...],我想您会喜欢它![...]”
Ines Montani-Matthew Honnibal- 爆炸AI创始人-spaCy创作者( 参考 )-( 参考 )
使用FastAPI创建的最小API
我将尝试向您展示如何创建一个简单但有用的API,以及针对开发人员的文档。 我们将编写一个随机短语生成器!
安装先决条件
pip install wheel -U pip install uvicorn fastapi pydantic
新模块!
Uvicorn是与ASGI兼容的Web服务器,我们将使用它运行应用程序。
首先,我们将创建应用程序的基础。
from fastapi import FastAPI app = FastAPI(title="Random phrase")
该应用程序已经在运行,可以启动。
在您的终端中编写此命令,然后在浏览器中打开页面, 网址为http://127.0.0.1:8000/docs 。
uvicorn <__>:app
但是,尽管在我们的应用程序中未指示单个端点-让我们对其进行修复!
资料库
由于我们正在编写随机短语生成器,因此显然需要将它们存储在某个位置。 为此,我选择了一个简单的python-dict
。
创建一个db.py
文件并开始编写代码。
我们导入必要的模块:
import typing import random from pydantic import BaseModel from pydantic import Field
之后-我们指定两个模型:输入短语(用户将发送给我们的短语)和“输出”(我们将发送给用户的短语)。
class PhraseInput(BaseModel): """Phrase model""" author: str = "Anonymous"
之后,创建一个用于处理数据库的简单类:
class Database: """ Our **fake** database. """ def __init__(self): self._items: typing.Dict[int, PhraseOutput] = {}
现在,您可以开始编写API本身。
API
创建main.py
文件并导入以下模块:
from fastapi import FastAPI from fastapi import HTTPException from db import PhraseInput from db import PhraseOutput from db import Database
我们初始化我们的应用程序和数据库:
app = FastAPI(title="Random phrase") db = Database()
并编写一个简单的方法来获得随机短语!
@app.get( "/get", response_description="Random phrase", description="Get random phrase from database", response_model=PhraseOutput, ) async def get(): try: phrase = db.get(db.get_random()) except IndexError: raise HTTPException(404, "Phrase list is empty") return phrase
如您所见,在装饰器中,我还指出了生成更漂亮文档所需的其他一些值:)在正式文档中,您可以查看所有可能的参数。
在这段代码中,我们试图从数据库中获取一个随机短语,如果数据库为空,我们将返回错误代码404。
同样,我们编写其他方法:
@app.post( "/add", response_description="Added phrase with *id* parameter", response_model=PhraseOutput, ) async def add(phrase: PhraseInput): phrase_out = db.add(phrase) return phrase_out @app.delete("/delete", response_description="Result of deleting") async def delete(id: int): try: db.delete(id) except ValueError as e: raise HTTPException(404, str(e))
就是这样! 我们小的但有用的API已完成!
现在,我们可以使用uvicorn启动该应用程序,打开在线文档( http://127.0.0.1/docs )并尝试使用我们的API!

有用的材料
当然,我无法告诉您FastAPI的所有功能,例如,智能DI系统,中间件,cookie,API中的标准身份验证方法(jwt,oauth2,api-key)等等!
但是,本文的目的不只是概述该框架的所有功能,而是推动您自己探索它的程度。 FastAPI有大量示例的丰富文档。
Github上一篇文章的代码
官方文件
Github仓库
聚苯乙烯
cryo8822 将该文章翻译成英文,谢谢! 。