首页 > 解决方案 > 为什么 python 广播器在配置 PostgreSQL 后端时收不到消息?

问题描述

我正在尝试让广播公司使用 FastAPI 和启用通知的 PostgreSQL 数据库。

这是我使用的代码

FastAPI (test_broadcaster.py)

from broadcaster import Broadcast

broadcast = Broadcast("postgres://<username>:<password>@localhost:5432/<database>")

async def broadcast_ws_receiver(websocket):
    async for message in websocket.iter_text():
        await broadcast.publish(channel="account", message=message)

async def broadcast_ws_sender(websocket):
    async with broadcast.subscribe(channel="account") as subscriber:
        async for event in subscriber:
            await websocket.send_text(event.message)

FastAPI (router.py)

from fastapi.routing import APIRouter
from fastapi.websockets import WebSocket
from fastapi.concurrency import run_until_first_complete

from test_broadcaster import broadcast_ws_sender, broadcast_ws_receiver

router = APIRouter()

@router.websocket("/broadcast")
async def broadcast_ws(websocket: WebSocket):
    await websocket.accept()
    
    await run_until_first_complete(
        (broadcast_ws_receiver, {"websocket": websocket}),
        (broadcast_ws_sender, {"websocket": websocket}),
    )

PostgreSQL (trigger name) # 上表账号

account

PostgreSQL(触发器函数)

BEGIN
  PERFORM pg_notify(
    'account',
    json_build_object(
      'operation', TG_OP,
      'record', row_to_json(NEW)
    )::text
  );

  RETURN NEW;
END;

建立 websocket 连接连接并更新表以触发通知时,没有任何反应。使用时也不行

NOTIFY account, 'hello world';

当更改为 Redis 时,它可以完美地工作,从 Redis 到 websocket,从 websocket 到 Redis。

这是一个错误吗?或者我在代码中遗漏了什么?

标签: pythonpostgresql

解决方案


推荐阅读