为什么您应该立即开始使用FastAPI

您好,Khabrovites!基础课程高级课程“ Python Developer”中的课程开始的前夕,我们为您准备了另一本有用的翻译。












由于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,因此您可以根据需要使用返回值。至少有两个很好的理由。



  1. 您可以通过修改字典全局覆盖依赖项app.dependency_overrides这将使测试变得更容易并嘲笑对象。
  2. 依赖关系(在我们的例子中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_djangoDjango,一切从一开始就可以正常工作。



+1:出色的文档



当然,如果框架的文档不完善,那么框架就不可能很棒。Django,Flask和其他公司在此方面做得很好,FastAPI紧跟他们。当然,由于他年轻得多,因此还没有关于他的一本书,但这只是时间问题。



如果您想了解FastAPI的实际应用,我为您提供了很好的指南。我编写了详细的教程,您可以通过该教程将ML模型部署到Docker,Docker Compose和GitHub Actions!



总而言之,无论您是要寻找一种快速,轻量级的框架来使用深度学习模型还是更复杂的事物,FastAPI都是您的选择。我很确定它将为您服务。






了解有关课程的更多信息






All Articles