由于Flask,Django,Falcon等强大的框架,Python在开发轻量级Web应用程序方面一直很受欢迎。由于Python作为机器学习语言的领导地位,它对于打包模型并将其作为服务提供特别有用。
多年以来,Flask一直是执行此类任务的主要工具,但是如果您还没有听说过,将会出现一个新的竞争者。FastAPI是一个受其前辈启发的相对较新的Python框架。它改善了它们的功能并修复了许多缺陷。 FastAPI建立在Starlette之上,并具有大量很棒的功能。
最近他获得了很大的欢迎,在过去的8个月里,我每天都与他合作,我可以自信地说,围绕他的所有炒作是完全合理的。如果您还没有尝试过,那么我为您汇总了五个为什么仍要了解它的原因。
尼斯简单的界面
所有框架都必须在开发人员的功能和自由之间取得平衡。Django功能强大,但过于固执。另一方面,Flask足够高,可以提供动作自由度,但还有很多留给用户。在这方面,FastAPI更接近Flask,但是设法达到更健康的平衡。
例如,让我们看看FastAPI如何定义一个端点。
from fastapi import FastAPI
from pydantic import BaseModel
class User(BaseModel):
email: str
password: str
app = FastAPI()
@app.post("/login")
def login(user: User):
# ...
# do some magic
# ...
return {"msg": "login successful"}
为了定义模式,使用了Pydantic,它是一个同样出色的Python库,用于数据验证。看起来很简单,但是引擎盖下有很多事情要做。验证输入数据的责任委托给FastAPI。例如,如果发送了不正确的请求,则电子邮件字段包含类型的值,
int
则将返回相应的错误代码,但应用程序不会崩溃,并抛出内部服务器错误(500)。而且几乎都是免费的。
具有
uvicorn
以下内容的简单示例应用程序:
uvicorn main:app
该应用程序现在可以接受请求。在这种情况下,请求将如下所示:
curl -X POST "http://localhost:8000/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"email\":\"string\",\"password\":\"string\"}"
锦上添花的是使用Swagger交互式界面根据OpenAPI自动生成文档。
用于FastAPI应用程序的Swagger接口
异步
与Node.js或Go中的WSGI Web框架相比,Python WSGI Web框架的最大缺点之一是无法异步处理请求。自从ASGI诞生以来,这不再是问题,FastAPI完全实现了此功能。您所要做的只是简单地使用async关键字声明端点,如下所示:
@app.post("/")
async def endpoint():
# ...
# call async functions here with `await`
# ...
return {"msg": "FastAPI is awesome!"}
依赖注入
FastAPI有一种非常不错的方式来管理依赖项。尽管不强制开发人员使用嵌入式注入来处理端点上的依赖关系,但强烈建议这样做。
例如,让我们创建一个端点,用户可以在其中评论特定文章。
from fastapi import FastAPI, Depends
from pydantic import BaseModel
class Comment(BaseModel):
username: str
content: str
app = FastAPI()
database = {
"articles": {
1: {
"title": "Top 3 Reasons to Start Using FastAPI Now",
"comments": []
}
}
}
def get_database():
return database
@app.post("/articles/{article_id}/comments")
def post_comment(article_id: int, comment: Comment, database = Depends(get_database)):
database["articles"][article_id]["comments"].append(comment)
return {"msg": "comment posted!"}
FastAPI
调用端点时在运行时使用get_database,因此您可以根据需要使用返回值。至少有两个很好的理由。
- 您可以通过修改字典全局覆盖依赖项
app.dependency_overrides
。这将使测试变得更容易并嘲笑对象。 - 依赖关系(在我们的例子中
get_database
)可以执行更复杂的检查,并允许您将它们与业务逻辑分离。这件事大大简化了。例如,因此可以方便地实现用户认证。
与数据库轻松集成
无论选择什么,无论是SQL,MongoDB,Redis还是其他任何方式,FastAPI都不会强迫您围绕数据库构建应用程序。如果您曾经通过Django与MongoDB一起工作过,您就会知道这会是多么痛苦。使用FastAPI,您无需执行额外的操作,因为将数据库添加到堆栈中是尽可能轻松的。(或更准确地说,工作量将由您选择的数据库决定,而不是使用特定框架所带来的复杂性。)
认真地看一下它的美。
from fastapi import FastAPI, Depends
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("sqlite:///./database.db")
Session = sessionmaker(bind=engine)
def get_db():
return Session()
app = FastAPI()
@app.get("/")
def an_endpoint_using_sql(db = Depends(get_db)):
# ...
# do some SQLAlchemy
# ...
return {"msg": "an exceptionally successful operation!"}
瞧!我已经看到你在打字
pip install fastapi
在计算机的终端上。
GraphQL支持
当您使用复杂的数据模型时,REST可能是一个主要障碍。当前端的最细微更改需要端点模式更新时,它不是很酷。在这种情况下,GraphQL可以帮助您。尽管GraphQL支持对于Python Web框架来说并不是什么新鲜事物,但Graphene和FastAPI可以很好地协同工作。无需额外安装任何扩展,例如
graphene_django
Django,一切从一开始就可以正常工作。
+1:出色的文档
当然,如果框架的文档不完善,那么框架就不可能很棒。Django,Flask和其他公司在此方面做得很好,FastAPI紧跟他们。当然,由于他年轻得多,因此还没有关于他的一本书,但这只是时间问题。
如果您想了解FastAPI的实际应用,我为您提供了很好的指南。我编写了详细的教程,您可以通过该教程将ML模型部署到Docker,Docker Compose和GitHub Actions!
总而言之,无论您是要寻找一种快速,轻量级的框架来使用深度学习模型还是更复杂的事物,FastAPI都是您的选择。我很确定它将为您服务。