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请求方法的getpostputdelete等,可以根据需要完成实现。如果请求了Endpoint实现类中没有实现的访问方法,Starlette将会抛出405错误。

WebSocketEndpointHTTPEndpoint要复杂一些。其中要先定义类成员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连接终止事件。