Я запускаю прямую .changes()
ленту новостей на RethinkDB и транслирую изменения с помощью Sanic WebSocket .
Поскольку нет гарантии, когда лента .changes()
закроется,Я хочу иметь возможность закрыть соединение после отключения клиента WS.В приведенном ниже коде я пытался использовать декоратор для установления и закрытия соединения, но кажется, что выполнение никогда не достигает conn.close()
.
Есть ли другой подход к нему?
from sanic import Sanic
from sanic.websocket import WebSocketProtocol
import json
import asyncio
from rethinkdb import RethinkDB
r = RethinkDB()
r.set_loop_type('asyncio')
app = Sanic()
def closeDBDecorator(func):
async def wrapper(request, ws, *args, **kwargs):
conn = await r.connect(host="localhost", user="admin", db="test")
await func(request, ws, conn)
conn.close()
return wrapper
@app.websocket('/status')
@closeDBDecorator
async def status(request, ws, conn):
data = await ws.recv()
data = json.loads(data)
status_table = r.db("x").table("y")
cursor = await status_table.get(data["id"]).changes().run(conn) # Changes cursor
async for update in cursor:
await ws.send(json.dumps(dict(update)))
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, workers=1, protocol=WebSocketProtocol)