Endpoints
前面路由一节提到路由处理器是由endpoint
参数定义的,需要接受一个Endpoint作为参数值。Starlette中提供了两种Endpoint类,一种是HTTPEndpoint
类,用于处理HTTP请求,一种是WebSocketEndpoint
,用于处理WebSocket请求。
在定义路由处理器时需要继承相应的Endpoint类,并实现其中相应的方法。以下给出一个实现HTTPEndpoint
类和WebSocketEndpoint
类的示例。
from starlette.application import Starlette
from starlette.response import PlainTextResponse
from starlette.endpoints import HTTPEndpoint, WebSocketEndpoint
app = Starlette()
@app.route('/')
class HomePage(HTTPEndpoint):
async def get(self, request):
return PlainTextResponse(f"Nice")
@app.route('/{username}')
class User(HTTPEndpoint):
async def get(self, request):
username = request.path_params['username']
return PlainTextResponse(f"Hello, {username}")
@app.websocket_route('/ws')
class Echo(WebSocketEndpoint):
encoding = "text"
async def on_receive(self, websocket, data):
await websocket.send_text(f"Message received: {data}")
如果要将HTTPEndpoint
类的实现绑定给路由的话,只需要将实现类本身绑定到app.add_route()
方法中的func
参数的位置即可,或者是Route类的endpoint
参数上,无需将实现类的实例绑定过去。
HTTPEndpoint
类中提供了对应与HTTP请求方法的get
、post
、put
、delete
等,可以根据需要完成实现。如果请求了Endpoint实现类中没有实现的访问方法,Starlette将会抛出405错误。
WebSocketEndpoint
比HTTPEndpoint
要复杂一些。其中要先定义类成员encoding
的值,用于指定在WebSocket传输中所使用的数据格式,可取的值有'json'
、'bytes'
、'text'
三种。之后需要实现以下三个方法或者其中的某几个以实现WebSocket通信功能。
async def on_connect(self, websocket, **kwargs)
,用于处理WebSocket连接建立的事件,可以使用await websocket.accept()
来完成连接建立。async def on_receive(self, websocket, data)
,用于从WebSocket接收数据。async def on_disconnect(self, websocket, close_code)
,用于处理WebSocket连接终止事件。