用FastAPI和Python快速开发高性能的API
如果你读过我以前关于Python的一些文章,你就知道我是Flask的粉丝,它是我用Python构建API的首选。然而,最近我开始听到很多关于Python的一个新的API框架,叫做FastAPI,在用它构建了一些API之后,我可以说,它非常了不起
这个项目是由Sebastian Ramírez创建的,在写这篇文章的时候,它已经积累了将近2万颗星,还有像微软、Uber、Netflix等大公司在生产中构建API。
但为什么这个新的库如此受欢迎,它与Flask或Django相比有什么不同?
功能介绍
FastAPI是一个相当简约的框架,更像是Flask的风格。然而,这并不意味着它的功能不强。FastAPI是使用现代Python概念构建的,它基于Python 3.6类型声明。让我们看看这个库所包含的一些功能。
自动文档
任何API都必须有关于端点和类型的文档。解决这个问题的常见方法是使用OpenAPI和随后的工具,如Swagger UI或ReDoc来展示这些信息。这些都是FastAPI自动提供的。让你更专注于你的代码而不是设置工具。
类型化的Python
这是一个很大的问题。FastAPI使用了Python 3.6的类型声明(感谢Pydantic),这意味着它使用了一个允许你指定变量类型的Python特性。而这个框架广泛地利用了它,为你提供了很好的编辑器支持。自动完成的工作令人惊讶。
下面是一个使用类型化声明的示例代码:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/")
def read_root(item: Item):
return item.price
我们刚刚从
name
到
name: str
就是这样!结果是

使用PyCharm在FastAPI中进行自动补全
真漂亮!
验证
由于Pydantic的存在,验证已经被集成到这个框架中。你可以验证标准的Python类型,也可以验证一些自定义的字段。这里有几个例子:
- JSON对象(dict)
- JSON数组(list)
- 具有最小和最大长度的字符串(str)。
- 带有最小和最大值的数字(int, float)
- URL
- 电子邮件
- UUID
- 以及更多...
安全和认证
这是任何API的关键部分,而且是我们通常只是重复的代码,那么为什么不把它的大部分集成到框架中呢?FastAPI正是这样做的。
该库提供了对以下内容的支持:
- HTTP Basic
- OAuth2(JWT令牌)
- 头文件、查询参数或cookies中的API密钥。
文档
也许这不完全是该框架的一个特点,但是,它值得一提。这个项目的文档简直令人惊叹。它非常清晰,并且用例子和解释涵盖了各个主题。
性能
FastAPI非常快!但不仅仅是编码快,而且它处理请求的速度也非常快。这并不是我说说而已。你可以使用techempower基准测试工具检查多个框架的基准。下面是我得到的Python框架的结果。Flask和Django在列表中远远落后,FastAPI排在第一位,因此是性能最好的。

TechEmpower基准测试结果
本质上是异步的
让我们看一下下面的代码:
@app.post("/item/", response_model=Item)
async def create_item(item: Item):
result = await some_code_running_in_background(item)
return result
这是Javascript吗?我向你保证,不是,尽管看起来很熟悉,对吗?这段代码实际上是Python,使用异步方法。
FastAPI默认支持异步端点,这可以简化并使你的代码更有效率。与Flask相比,这是一个巨大的优势。另一方面,Django已经做了一些异步支持工作,但没有像FastAPI那样集成。
总结
FastAPI是一个相对较新的框架,它沿用了Flask的极简方法,但增加了一些关键的功能,使其更容易操作,并具有惊人的性能。对于你的下一个API项目,它是一个很好的选择,随着我在API上使用的越来越多,你会看到我对它的更多介绍。
谢谢你的阅读!