我想制作一个只能由一个客户端同时编辑的 webapp。我使用烧瓶和烧瓶socketio。授权客户端离开后(socketio 中的断开连接事件),下一个应该能够编辑内容。现在我对 websockets 有多次调用,而 http 不仅仅是一个 websocket。因为我也有简单的 html 表单,所以我也必须阻止传入的请求。
我可以从 socketio 事件中的请求对象获取 IP。
connected = None
@socketio.on('disconnect', namespace='/notifications')
def disconnect():
global connected
connected = None
logger.info('Client disconnected')
@socketio.on('connect', namespace='/notifications')
def notifications():
global connected
if not request.headers.getlist("X-Forwarded-For"):
ip = request.remote_addr
else:
ip = request.headers.getlist("X-Forwarded-For")[0]
if connected is None:
connected = ip, request.environ["REMOTE_PORT"]
logger.info("Client connected. %s:%s", connected[0],connected[1])
# do stuff
else:
logger.info("Blocked %s:%s", ip, request.environ["REMOTE_PORT"])
这对我来说似乎是一个糟糕的方法......