是的,你可以!
在 socket.io 服务器上,我有类似的东西:
io.on('connection', (socket) => {
socket.emit('init', { id: socket.id, status: 'connected'});
socket.on('user connected', (data) => {
register_socket_client(redisClient, data);
});
socket.on('disconnect', () => {
unregister_socket_client(redisClient, socket.id);
});
});
server.listen(8080, '0.0.0.0', () => {
console.log('[*] Server listening on port 8080');
});
请注意,我将 socket_client 存储在一个 redis 实例中。我让你假设如何实现在 redis 中保存、取消保存某些内容的功能
所以,在flask渲染的html文件中,我们有:
// http://localhost:8080 refer to your socket.io server
var socket = io('http://localhost:8080');
var user_connected = "{% if current_user.is_anonymous %}false{% else %}true{% endif %}" === 'true';
socket.on('init', function (data) {
if (user_connected) {
socket.emit('user connected', { user_id: xxx, socket_id: Nxxx});
socket.on('notify', function (data) {
// Do something, modify the DOM to add an alert on your app
console.log(data);
});
}
});
不要关注 user_connected 的事情。只是我只需要为已连接的用户连接socket.io
现在你的flask渲染的静态应用应该和你的socket.io连接了
我在 socket.io 服务器 上也有一个私有端点(仅使用 jwt 令牌),如下所示:
app.post('/notify', passport.authenticate('jwt', { session: false}), (req, res) => {
const query = req.query;
const payload = req.body;
if (query.user_id) {
// here you can retrieve the data from redis based on user_id for example
// We can assume that we have everything in a `data` variable.
io.to(data.socket_id).emit('notify', payload);
}
return res.status(200).json({'ping': 'pong'});
});
Flask 服务器可以发出 request.post('http://localhost:8080/?user_id=USER_ID', data={}) 之类的请求