Starlette是一个轻量级的ASGI框架和工具包,主要用于构建高性能的asyncio服务。它具备以下特点:
- 轻量级HTTP Web框架:Starlette提供了一个简单且复杂度低的HTTP Web框架。
- WebSocket支持:允许在应用中实现WebSocket功能。
- 后台任务:支持在进程中执行后台任务。
- 事件触发:提供启动和关闭服务时的事件触发功能。
- 测试客户端:基于
httpx
构建的测试客户端。 - 其他功能:包括CORS, GZip, 静态文件, 流式响应支持,以及会话和Cookie支持。
- 100% 测试覆盖率和类型注解:确保代码的可靠性和可维护性。
- 依赖少:Starlette仅依赖
anyio
,其他功能依赖可选。 - 兼容性:与
asyncio
和trio
后端兼容。 - 高性能:在独立基准测试中表现出色。
安装
要使用Starlette,首先需要安装它和ASGI服务器,如Uvicorn:
pip3 install starlette
pip3 install uvicorn
示例代码
一个基本的Starlette应用示例:
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
async def homepage(request):
return JSONResponse({'hello': 'world'})
app = Starlette(debug=True, routes=[
Route('/', homepage),
])
# 运行应用
# uvicorn example:app
模块化设计
Starlette既可以作为完整的框架使用,也可以作为ASGI工具包。它的模块化设计促进了可重用组件的构建,这些组件可以在任何ASGI框架之间共享。
Starlette的官方文档提供了更详细的信息和示例,是学习和使用该库的优秀资源。
基础功能
- 路由:Starlette提供了一种简单直观的方式来定义路由。你可以使用
Route
来定义HTTP路由,或者使用WebSocketRoute
来定义WebSocket路由。
示例:from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route async def homepage(request): return JSONResponse({'hello': 'world'}) app = Starlette(debug=True, routes=[ Route('/', homepage), ])
- 请求和响应:Starlette提供了
Request
和Response
对象来处理HTTP请求和响应。你可以使用这些对象来访问请求的数据和设置响应的头部和正文。
示例:from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.requests import Request async def homepage(request: Request): name = request.query_params.get('name', 'World') return JSONResponse({'message': f'Hello, {name}'}) app = Starlette(debug=True, routes=[ Route('/', homepage), ])
- 异常处理:Starlette允许你定义自定义的异常处理函数,以便在发生错误时返回适当的响应。
示例:from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.exceptions import HTTPException async def http_error(request, exc): return JSONResponse({'error': str(exc.detail)}, status_code=exc.status_code) app = Starlette(debug=True, routes=[ Route('/', homepage), ], exception_handlers={404: http_error})
进阶功能
- 中间件:Starlette支持中间件,允许你在请求和响应之间插入自定义逻辑。
示例:from starlette.applications import Starlette from starlette.middleware import Middleware from starlette.middleware.gzip import GZipMiddleware from starlette.responses import JSONResponse async def homepage(request): return JSONResponse({'hello': 'world'}) app = Starlette(debug=True, routes=[ Route('/', homepage), ], middleware=[ Middleware(GZipMiddleware), ])
- 背景任务:Starlette允许你在响应发送后执行后台任务。
示例:from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.background import BackgroundTasks async def homepage(request): tasks = BackgroundTasks() tasks.add_task(print_message, message='Background task executed') return JSONResponse({'message': 'Hello, world'}) def print_message(message): print(message) app = Starlette(debug=True, routes=[ Route('/', homepage), ])
- 测试客户端:Starlette提供了一个测试客户端,允许你轻松地测试你的应用。
示例:from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.testclient import TestClient async def homepage(request): return JSONResponse({'hello': 'world'}) app = Starlette(debug=True, routes=[ Route('/', homepage), ]) with TestClient(app) as client: response = client.get('/') assert response.json() == {'hello': 'world'}
高级教程
- 构建REST API:使用Starlette构建REST API是一个常见用例。你可以结合使用路由、请求和响应处理以及中间件来实现这一目标。
- WebSocket服务:Starlette支持WebSocket,允许你构建实时通信应用。
- 集成数据库:你可以将Starlette与各种数据库集成,例如使用SQLAlchemy或Django ORM。
- 部署到生产环境:Starlette应用可以部署到各种生产环境,例如使用Uvicorn作为ASGI服务器。
Starlette的官方文档提供了更多高级教程和示例,可以帮助你深入了解和使用该库。
高级功能深入
- 构建REST API:Starlette非常适合构建RESTful API。你可以利用其路由系统来定义不同的HTTP方法(如GET, POST, PUT, DELETE)来处理不同的资源操作。
示例:创建一个简单的REST API来管理用户。from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route # 假设有一个用户数据库 users_db = {'1': {'name': 'Alice'}, '2': {'name': 'Bob'}} async def list_users(request): return JSONResponse([user for user in users_db.values()]) async def get_user(request): user_id = request.path_params['user_id'] if user_id in users_db: return JSONResponse(users_db[user_id]) else: return JSONResponse({'error': 'User not found'}, status_code=404) async def create_user(request): # 从请求中获取用户数据 data = await request.json() user_id = str(len(users_db) + 1) users_db[user_id] = {'name': data['name']} return JSONResponse(users_db[user_id], status_code=201) app = Starlette(debug=True, routes=[ Route('/users', list_users, methods=['GET']), Route('/users/{user_id}', get_user, methods=['GET']), Route('/users', create_user, methods=['POST']), ])
- WebSocket服务:Starlette支持WebSocket,允许你实现实时通信功能。
示例:创建一个简单的WebSocket服务。from starlette.applications import Starlette from starlette.routing import WebSocketRoute from starlette.websockets import WebSocket async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: text = await websocket.receive_text() await websocket.send_text(f'Message: {text}') app = Starlette(debug=True, routes=[ WebSocketRoute('/ws', websocket_endpoint), ])
- 集成数据库:Starlette本身不提供数据库支持,但你可以轻松地将其与任何Python数据库库集成。
示例:使用SQLAlchemy ORM。from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 定义数据库模型 Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) # 创建数据库引擎 engine = create_engine('sqlite:///database.db') Base.metadata.create_all(engine) # 创建Session本地工厂 SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
- 部署到生产环境:Starlette应用通常与Uvicorn一起部署。Uvicorn是一个快速ASGI服务器,非常适合在生产环境中运行Starlette应用。
示例:使用Uvicorn运行Starlette应用。uvicorn example:app --reload --host 0.0.0.0 --port 8000
这些高级功能展示了Starlette的强大和灵活性。通过结合使用这些功能,你可以构建复杂且高性能的异步Web应用。Starlette的官方文档提供了更多详细信息和示例,是学习和使用该库的优秀资源。