Starlette
Starlette 是一个轻量级的 ASGI 框架/工具包,它是构建高性能 asyCIO 服务的理想选择。
它是生产就绪的,并为你提供了以下内容。
- 令人印象深刻的性能
- 支持 WebSocket。
- 支持 GraphQL。
- 进程中的后台任务。
- 启动和关闭事件。
- 建立在请求上的测试客户端。
- CORS, GZip, Static Files, Streaming responses.
- 支持会话和 Cookie。
- 100% 的测试覆盖率。
- 100% 的类型注释代码库。
- 零硬性依赖。
要求
- Python 3.6 以上
安装方法
$ pip3 install starlette
你还需要安装一个 ASGI 服务器,比如 uvicorn, daphne、或 hypercorn.
$ pip3 install uvicorn
例子
example.py:
from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route async def homepage(request): return JSONResponse({'hello': 'world'}) routes = [ Route("/", endpoint=homepage) ] app = Starlette(debug=True, routes=routes)
然后使用 Uvicorn 运行应用程序。
$ uvicorn example:app
更完整的例子,请看 encode/starlette-example。
依赖性
Starlette 没有任何硬性的依赖关系,但以下是可选的。
requests
-- 如果你想使用TestClient
,则需要。aiofiles
-- 如果你想使用FileResponse
或StaticFiles
,则需要。jinja2
-- 如果你想使用Jinja2Templates
,则需要。python-multipart
-- 如果你想使用request.form()
来支持表单解析,则需要。itsdangerous
-- 支持SessionMiddleware
时需要。pyyaml
-- 支持SchemaGenerator
.时需要。graphene
-- 支持GraphQLApp
时需要。ujson
-- 如果你想使用UJSONResponse
,则需要。
你可以用 pip3 install starlette[full] 来安装所有这些。
框架或工具包
Starlette 可以作为一个完整的框架使用,也可以作为 ASGI 工具箱使用。你可以独立使用它的任何组件。
from starlette.responses import PlainTextResponse async def app(scope, receive, send): assert scope['type'] == 'http' response = PlainTextResponse('Hello, world!') await response(scope, receive, send)
在 example.py 中运行应用程序:
$ uvicorn example:app INFO: Started server process [11509] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
使用 --reload 运行 uvicorn,以实现代码更改时的自动重载。
模块化
Starlette 的模块化设计促进了可重用组件的建立,这些组件可以在任何 ASGI 框架之间共享。这应该可以建立一个共享中间件和可挂载应用的生态系统。
清晰的 API 分离也意味着更容易理解每个组件。
性能方面
独立的 TechEmpower 基准显示,在 Uvicorn 下运行的 Starlette 应用程序是 目前最快的 Python 框架之一。(*)
对于高吞吐量的负载,你应该:
- 确保安装 ujson 并使用 UJSONResponse。
- 使用 uvicorn worker 类使用 gunicorn 运行。
- 每个 CPU 核使用一个或两个 worker。(你可能需要进行实验。)
- 禁用访问日志。
例如
gunicorn -w 4 -k uvicorn.workers.UvicornWorker --log-level warning example:app
一些 ASGI 服务器也有纯 Python 的实现,所以如果你的应用代码有 CPU 限制的部分,你也可以在 PyPy 下运行。
无论是程序上的。
uvicorn.run(..., http='h11', loop='asyncio')
或者使用 Gunicorn。
gunicorn -k uvicorn.workers.UvicornH11Worker ...
许可证
Starlette 是 BSD licensed 代码。在英国布莱顿设计和建造。
(The first version translated by vz on 2020.10.03)