我正在构建实时流媒体应用程序。如果用户在线,用户可以呼叫其他用户。我可以在用户登录时注册日志。但是,我正在寻找一种方法来检查用户是否退出/退出应用程序。欢迎提出任何建议。
答案 0 :(得分:1)
1)您可以实施心跳系统,在线用户互相发送消息以确保他们活着
2)如果退出你的意思是用户选择了一个指定的“退出”按钮,那么你只需向其他用户发送一个回复说明你已退出
我确信还有很多方法可以做到,但这些是我在分布式系统课程中学到的两种方式
答案 1 :(得分:1)
您可以使用Flask-SocketIO轻松地对其进行监视。使用此功能的好处是您可以实时监视它。下面将对您有所帮助:
项目目录
Project
|
|-> templates
| |
| |-> home.html
| |-> login.html
| |-> logout.html
|
|-> app.py
app.py
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'SecretKey@123'
socket = SocketIO(app)
@app.route('/')
def index():
return render_template('home.html')
@app.route('/login/<username>')
def login(username):
'''
When the user logs in.
'''
return render_template('login.html', username=username)
@app.route('/logout/<username>')
def logout(username):
'''
When the user logs out.
'''
return render_template('logout.html', username=username)
@socket.on('online')
def online(data):
emit('status_change', {'username': data['username'], 'status': 'online'}, broadcast=True)
@socket.on('offline')
def online(data):
emit('status_change', {'username': data['username'], 'status': 'offline'}, broadcast=True)
if __name__ == '__main__':
socket.run(app)
home.html
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
socket.on('status_change', function(data) {
console.log('Status changed: ', data)
});
</script>
login.html
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
socket.emit('online', {'username': '{{username}}' });
</script>
logout.html
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
socket.emit('offline', {'username': '{{username}}' });
</script>
现在,使用上面的代码,您可以在第一个标签中的两个标签中打开http://localhost:5000链接,如果您点击了链接http://localhost:5000/login/A,则在第二个标签的控制台中将看到{ {1}}。现在,在第一个标签中,如果您点击链接http://localhost:5000/logout/A,那么您将在第二个标签的控制台中看到Status changed: {username: "A", status: "online"}
。
我希望这会有所帮助。
答案 2 :(得分:0)
为了能够做到这一点,您需要在每个用户登录时使用异步连接。查看Tornadi哪种更适合此类应用程序。但是如果你坚持使用烧瓶,你必须找到一种方法来使用Tornado实现系统的异步部分并使其与Flask共存。如果您不想使用Tornado,也可以使用Python's asyncio module,但是您必须从头开始创建所有内容,这在大多数情况下并不理想。
答案 3 :(得分:0)
我认为这取决于你对&#34;退出的定义&#34;是在您的应用程序的上下文中。正如user1736436所说,如果它只是一个问题,他们是否点击了&#34;退出&#34;按钮,它非常简单。当然,如果用户上网停止,或浏览器崩溃,你就不会知道。
如果您正在使用其他实时连接,例如websockets,则可以将其定义为表示该套接字是否打开。 Websocket实现通常具有某种状态属性,您可以在服务器端读取(例如gevent-websocket套接字具有布尔属性.closed,您可以检查)
如果你进入心跳路线,你可能最终会使用setInterval回调在Javascript中触发它,并在服务器上写一些定时过程,如果你没有得到一个一阵子。