检查用户是否在Flask中在线

时间:2015-04-05 07:57:24

标签: flask user-management flask-login

我正在构建实时流媒体应用程序。如果用户在线,用户可以呼叫其他用户。我可以在用户登录时注册日志。但是,我正在寻找一种方法来检查用户是否退出/退出应用程序。欢迎提出任何建议。

4 个答案:

答案 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中触发它,并在服务器上写一些定时过程,如果你没有得到一个一阵子。