【问题标题】:How to get ip address of a client that connect to a websocket server in FastAPI?如何在 FastAPI 中获取连接到 websocket 服务器的客户端的 IP 地址?
【发布时间】:2021-12-10 18:13:25
【问题描述】:

我是 FastAPI 的新手。我在 127.0.0.1:8000/abcd 和 ConnectionManager 对象中有一个 websocket 服务器。

class ConnectionManager:
def __init__(self):
    self.active_connections: List[WebSocket] = []

async def connect(self, websocket: WebSocket):
    await websocket.accept()
    self.active_connections.append(websocket)

def disconnect(self, websocket: WebSocket):
    self.active_connections.remove(websocket)

async def send_personal_message(self, message: str, websocket: WebSocket):
    await websocket.send_text(message)

async def broadcast(self, message: str):
    for connection in self.active_connections:
        await connection.send_text(message)

manager = ConnectionManager()

还有 websocket 服务器:

@router.websocket("/abcd")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)

如何获取客户端 Websocket 连接的 IP 地址?以及如何将 active_connections 更改为字典,键是 IP 地址,值是 websocket?谢谢

【问题讨论】:

    标签: python sockets websocket fastapi


    【解决方案1】:

    用于创建 websocket 的初始 HTTP 请求的信息存储在 Websocket 对象中,并且可以进行自省。 Starlette 提供了一些帮助方法来检索这些信息。

    @router.websocket("/abcd")
    async def websocket_endpoint(websocket: WebSocket):
        client_host = websocket.client.host
        await manager.connect(websocket)
    

    更多信息可以查看 Starlette Websocket 源码:

    https://github.com/encode/starlette/blob/5ee04ef9b1bc11dc14d299e6c855c9a3f7d5ff16/starlette/websockets.py#L20

    以及它的超类 HTTPConnection 的来源:

    https://github.com/encode/starlette/blob/5ee04ef9b1bc11dc14d299e6c855c9a3f7d5ff16/starlette/requests.py#L57

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多