Закрыть соединение с БД, когда WebSocket Client отключается, когда внутри фида RethinkDB .Changes - PullRequest
0 голосов
/ 30 мая 2019

Я запускаю прямую .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)
...