为什么要尝试FastAPI?

图片 徽标取自Github FastAPI 存储库


FastAPI是一个用Python编程语言编写的相对较新的Web框架,用于基于Python 3.6+的新功能(例如:类型提示,本机异步(asyncio) ) 除其他外,FastAPI与OpenAPI架构紧密集成,并通过SwaggerReDoc为您的API自动生成文档


FastAPI基于StarlettePydantic
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" #  .    -   . text: str = Field(..., title="Text", description="Text of phrase", max_length=200) #  .   - 200 . class PhraseOutput(PhraseInput): id: typing.Optional[int] = None # ID     . 

之后,创建一个用于处理数据库的简单类:


 class Database: """ Our **fake** database. """ def __init__(self): self._items: typing.Dict[int, PhraseOutput] = {} # id: model def get_random(self) -> int: #    return random.choice(self._items.keys()) def get(self, id: int) -> typing.Optional[PhraseOutput]: #    ID return self._items.get(id) def add(self, phrase: PhraseInput) -> PhraseOutput: #   id = len(self._items) + 1 phrase_out = PhraseOutput(id=id, **phrase.dict()) self._items[phrase_out.id] = phrase_out return phrase_out def delete(self, id: int) -> typing.Union[typing.NoReturn, None]: #   if id in self._items: del self._items[id] else: raise ValueError("Phrase doesn't exist") 

现在,您可以开始编写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 将该文章翻译成英文,谢谢!

Source: https://habr.com/ru/post/zh-CN478620/


All Articles