繁体   English   中英

如何在 FastAPI 中获取连接到 websocket 服务器的客户端的 ip 地址?

[英]How to get ip address of a client that connect to a websocket server in FastAPI?

我是 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? 谢谢

来自用于创建 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM