使用 Starlette 构建异步 Python 服务

发布日期:2026-07-19 08:47:03  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 08:47:03  
0

介绍

就构建简单的同步 API 而言,Python 及其生态系统中的 WSGI Web 服务器框架(如 Flask)通常足以完成工作。但是,如果您需要扩展应用程序的后端怎么办?例如,如果您有一个可以扩展其计算预测的机器学习模型怎么办?那么,您还需要确保位于模型顶部的 API 层也可以扩展。在这些情况下,同步 WSGI 框架可能不够用……Starlette 来救援!

Starlette 是一个可以完全异步运行的 ASGI Web 服务器框架。因此,Starlette 可以大规模处理请求,解决上面提出的问题!在接下来的部分中,您将学习以下内容:

  • 如何启动并运行 Starlette
  • 如何添加路由并提供静态文件
  • 如何异步扩展你的服务

让我们开始吧!

安装

Starlette 需要 Python 3.6 或更高版本,可使用pip下载。

要使用pip安装 Starlette ,您可以运行以下命令:

      pip install starlette
    

如果您在虚拟环境中并希望通过requirements.txt文件进行安装,您可以这样做:

      # requirements.txt
starlette==0.13.6
    
      pip install -r requirements.txt
    

下载库后,您就可以开始使用该框架。如您所见,Starlette 有许多导入可供使用。以下是一些非常重要的内容:

      # app.py

from starlette.applications import Starlette
from starlette.routing import Route
    

创建 Starlette 服务

创建 Starlette 服务或 API 非常简单。以下代码演示了如何实例化 Starlette 应用,然后为其创建路由。

      from starlette.applications import Starlette
from starlette.routing import Route
from starlette.responses import PlainTextResponse
from starlette.responses import JSONResponse
import uvicorn

from my_model import predict


def index(request):
    return PlainTextResponse("My Index Page!")

def model_stats(request):
    return JSONResponse({'stats': [1, 0 , 2, 3]})

def model_predict(request):
    prediction_req = request.json()
    prediction = predict(prediction_req)
    return JSONResponse(prediction)


routes = [
    Route('/', index),
    Route('/stats', model_stats),
    Route('/predict', model_predict, methods=['POST'])
]

app = Starlette(debug=True, routes=routes)

if __name__ == "__main__":
    uvicorn.run(app, host='0.0.0.0', port=8000)
    

要创建服务静态文件的路由,只需像这样使用Mount :

      from starlette.routing import Mount
from starlette.staticfiles import StaticFiles

routes = [
    Route('/', index),
    Route('/stats', model_stats),
    Route('/predict', model_predict, methods=['POST'])
    Mount('/media', app=StaticFiles(directory='media'), name='media')
]
    

使你的服务异步

这很酷,但是您可以通过使其异步运行来扩展您的预测路由吗?Python 3.5 通过 Python 标准库的新asyncio部分将 async/await 语法引入该语言。使用此语法,您可以创建完全非阻塞的 API 路由。

注意:请小心 - 异步代码非常难以调试。要打开 asyncio 的调试模式,请确保已设置PYTHONASYNCIODEBUG环境变量。

例如:PYTHONASYNCIODEBUG=1 python app.py

以下是新的异步代码:

      from starlette.applications import Starlette
from starlette.routing import Route
from starlette.responses import PlainTextResponse
from starlette.responses import JSONResponse
import uvicorn
import asyncio

from my_model import predict


async def index(request):
    return PlainTextResponse("My Index Page!")

async def model_stats(request):
    return JSONResponse({'stats': [1, 0 , 2, 3]})

async def model_predict(request):
    prediction_req = request.json()
    prediction = await predict(prediction_req)
    return JSONResponse(prediction)


routes = [
    Route('/', index),
    Route('/stats', model_stats),
    Route('/predict', model_predict, methods=['POST'])
]

app = Starlette(debug=True, routes=routes)

if __name__ == "__main__":
    uvicorn.run(app, host='0.0.0.0', port=8000)
    

在上面的示例中,首先导入了asyncio库,以便您可以使用 async/await。接下来,所有路由都被指定为异步路由。请注意model_predict路由,它用于包装机器学习模型的预测功能。现在使用await关键字来充分利用后台模型的异步功能。现在 API 将与模型一起扩展!

结论

在本指南中,您学习了如何使用 Starlette 创建基于 ASGI 框架的 Python HTTP 服务。更重要的是,您发现了如何使您的服务完全异步,以便它可以随着传入的请求数量而扩展。

本指南仅简要介绍了 Starlette 和 ASGI 的世界。除了这里讨论的内容之外,该框架还有许多其他功能。有关更多信息和高级用法,请查看 Starlette文档

以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据