全文共1863字,预计学习时长10分钟
图源:unsplash
凭借着拥有Flask,Django,Falcon等众多出色框架,Python一直是开发轻量级Web应用程序的热门选择,同时作为机器学习第一语言,它对于模型打包并将它们作为web服务公开方面特别方便。
多年来,Flask都是完成这项工作的不二选择。但现在,新的选择出现了。FastAPI是一个相对崭新的Python Web框架,它脱胎于之前的框架并修复了许多缺陷,它基于Starlette网络框架,并为表单带来了许多实用的功能。
过去的8个月里我每天都在使用它,如果你还没有尝试过,我想给你五个尝试它的理由。
简单却出色的界面
图源:websystemer
所有Web框架都需要在功能性与给开发人员自由度之间取得平衡。Django功能强大但过于刻板;Flask的配置很灵活,可以提供很大的自由度,但用户却有许多工作要做;在频谱方面,FastAPI比Flask的使用范围更广,但它还要设法达到一种更健康的平衡。
让我们看看如何在FastAPI中定义端点:
fromfastapiimportFastAPI
frompydanticimportBaseModel
classUser(BaseModel):
email:str
password: str
app = FastAPI()
@app.post("/login")
deflogin(user:User):
# ...
#do some magic
# ...
return {"msg":"login successful"}
它使用Pydantic定义模式,这是用于数据验证的Python库。这里的操作看着很简单,但是后端却并不简单。
将输入验证的责任委托给FastAPI。如果请求不正确则将返回错误代码,例如email字段包含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 UI根据OpenAPI自动生成文档:
用于FastAPI应用程序的Swagger UI
异步
与Node.js或Go中相比,Python WSGI Web框架的最大缺点之一是无法异步处理请求。自从引入ASGI以来这一问题就迎刃而解了,FastAPI充分利用了这一点。你要做的就是简单地使用async关键词声明端点,如下所示:
@app.post("/")
async def endpoint():
# ...
# call async functions here with `await`
# ...
return{"msg":"FastAPI is awesome!"}
依赖注入
图源:unsplash
FastAPI管理依赖项的方式非常不错。尽管它没有强制开发人员执行,但是我强烈建议你使用内置的注入系统来处理端点中的依赖项。
举个例子,让我们写一个端点,用户可以在其中发布对某些文章的评论:
fromfastapi import FastAPI, Depends
from pydanticimport BaseModel
class Comment(BaseModel):
username: str
content: str
app = FastAPI()
database ={
"articles": {
1: {
"title":"Top 3Reasons 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": "commentposted!"}
在调用端点时,FastAPI在运行时会自动评估get_database函数,因此你可以根据需要使用返回值,这么做的原因在于:
· 可以通过修改 app.dependency_overrides 字典来重写全局依赖关系。你可以轻松模拟对象,进行测试会十分轻松。
· 依赖项(在我们的例子中是get_database)可以执行更复杂的检查,可以将它们与业务逻辑分开,在很大程度上将复杂的事情简单化。例如轻松实现用户身份验证。
与数据库轻松集成
你可以选择SQL,MongoDB,Redis或其他任意的,FastAPI不会强迫你围绕它构建应用程序。如果你曾经试用过Django与MongoDB一起工作,那么这种痛苦你一定能懂。
使用FastAPI,你无需再经历这些,将数据库添加到堆栈中会变得简单起来。或者更确切地说,要完成的工作量将由你选择的数据库决定,而不是由Web框架增加的复杂性决定。
来看看这些美妙的语言吧:
fromfastapiimportFastAPI, Depends
fromsqlalchemyimportcreate_engine
fromsqlalchemy.ormimport sessionmaker
engine=create_engine("sqlite:///./database.db")
Session = sessionmaker(bind=engine)
def get_db():
returnSession()
app = FastAPI()
@app.get(“ /”)
def an_endpoint_using_sql(db =Depends(get_db)):
# ...
# do some SQLAlchemy
# ...
return {"msg": "an exceptionally successfuloperation!"}
GraphQL支持
当使用复杂的数据模型时,REST可能常常会成为阻碍,前端的微小变化需要更新端点的架构可不是闹着玩的。GraphQL在这些情况下就很有用,尽管它不是唯一的,但是Graphene和FastAPI可以无缝地协同工作,无需为Django安装任何诸如graphene_django 之类的扩展程序就可以在本地运行。
出色的文档
如果没有出色的文档,好的框架就无法真正发挥作用。Django,Flask在这方面很出色,FastAPI也毫不逊色。由于它面世的时间还很短,市面上还没有关于它的书籍,但这只是时间问题。
图源:unsplash
无论你是要寻找一种快速、轻量级的框架来服务于你的深度学习模型还是要寻找更复杂的东西,FastAPI都可以帮到你。尝试一次,你会发现入股不亏。
一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)