エンドポイント
Starletteには、HTTPメソッドスケジューリングとWebSocketセッションを処理するためのクラスベースのビューパターンを提供する HTTPEndpoint クラスと WebSocketEndpoint クラスが含まれています。
HTTPエンドポイント
HTTPEndpoint クラスはAS GIアプリケーションとして使用できます。
starletteからPlainTextResponseをインポート
from starlette. endpoints import HTTPEndpoint
class App(HTTPEndpoint):
async def get(self, request):
return PlainTextResponse(f"こんにちは、世界!")
Starletteアプリケーションインスタンスを使用してルーティングを処理している場合は、HTTPEndpoint クラスにスケジュールできます。クラスのインスタンスではなく、クラス自体にスケジュールするようにしてください。
Starlette. applicationからStarletteをインポート
starletteからPlainTextResponseをインポート
from starlette. endpoints import HTTPEndpoint
from starlette. routingインポートルート
クラスホームページ(HTTPEndpoint):
async def get(self, request):
return PlainTextResponse(f"こんにちは、世界!")
class User(HTTPEndpoint):
async def get(self, request):
username=request. path_params['username']
return PlainTextResponse(f"Hello,{username}")
ルート=[
Route("/",ホームページ),
ルート("/{username}",ユーザ)
]
app=Starlette(ルート=ルート)
HTTPエンドポイントクラスは、対応するハンドラにマップされていないリクエストメソッドに対して、「405メソッドが許可しない」応答で応答します。
WebSocketエンドポイント
WebSocketEndpoint クラスは、WebSocket インスタンスの機能を中心にラッパーを提供するAS GIアプリケーションです。
AS GI接続範囲は、エンドポイントインスタンスの .scope を介してアクセスでき、on_receive メソッドで期待されるWebSocketデータを検証するためにオプションで設定できる encoding プロパティがあります。
エンコーディングの種類:
'json''bytes''text'
特定のAS GI WebSocketメッセージタイプを処理するには、3つのオーバーライド可能な方法があります。
async def on_connect(websocket, **kwargs)async def on_receive(websocket, data)-
async def on_disconnect(websocket, close_code)starlette. endpointsからWebSocketEndpointをインポート
class App(WebSocketEnd point): エンコーディング='bytes'
async def on_connect(self, websocket): websocketを待ちます。 async def on_受け取る(self, websocket,data): websocket. send_bytes(b"メッセージ:"+データ)を待つ async def on_disconnect(self, websocket,close_code): パス
WebSocketEndpoint は、Starlette アプリケーションクラスでも使用できます。
uvicornをインポート
Starlette. applicationからStarletteをインポート
starlette. endpointsからWebSocketEndpoint、HTTPEndpointをインポート
starletteからHTMLResponseをインポート
starlette. routingインポートルート、WebSocketRoute
html="""
<! DOCTYPE html>
<html>
<head>
<title>チャット</title>
</head>
<body>
<h1>WebSocketチャット</h1>
<form action="" onsubmit="sendMessage(event)">
<input type="text" id="messageText" autocomplete="off"/>
<button>送る</button>
</form>
<ul id='messages'>
</ul>
<script>
var ws=new WebSocket("ws://localhost:8000/ws");
ws. on message=function(event){
varメッセージ=document. getElementById('メッセージ')
var message=document. createElement('li')
var content=document. createTextNode(event.data)
message. appendChild(content)
message. appendChild(メッセージ)
};
関数sendMessage(event){
var input=document. getElementById("message Text")
ws. send(input.value)
input. value=''
event. Prevention entDefault()
}
</script>
</body>
</html>
"""
クラスホームページ(HTTPEndpoint):
async def get(self, request):
return HTMLレスポンス(html)
class Echo(WebSocketEnd point):
エンコーディング="テキスト"
async def on_受け取る(self, websocket,data):
websocket. send_textを待っています(f"メッセージテキストは:{data}でした")
ルート=[
Route("/",ホームページ),
WebSocketRoute("/ws",エコー)
]
app=Starlette(ルート=ルート)