【问题标题】:Check if user is online in Flask检查用户是否在 Flask 中在线
【发布时间】:2015-04-05 07:57:23
【问题描述】:

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

【问题讨论】:

  • 我认为这应该被标记为flask而不是flash?还是两者都用?
  • @GoBusto 感谢您指出我。这是一个auto错误。

标签: flask user-management flask-login


【解决方案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,则在第二个选项卡的控制台中您将看到Status changed: {username: "A", status: "online"}。现在,在第一个选项卡中,如果您点击链接 http://localhost:5000/logout/A,那么您将在第二个选项卡的控制台中看到 Status changed: {username: "A", status: "offline"}

希望对你有帮助。

【讨论】:

  • 如果用户没有点击注销 URL 并直接关闭浏览器会发生什么?
  • 如果你直接关闭浏览器/标签,什么都不会发生。如果你想处理这种情况,那么你可以看看this的答案。
【解决方案2】:

1)您可以实现一个心跳系统,在线用户互相发送消息以确保他们还活着

2) 如果退出意味着用户选择了指定的“退出”按钮,那么您可以向其他用户发送回复说您已退出

我确信还有很多方法可以做到这一点,但这是我在分布式系统课程中学到的两种方法

【讨论】:

    【解决方案3】:

    我认为这取决于您在应用上下文中对“注销”的定义。正如user1736436所说,如果只是他们是否单击“注销”按钮的问题,那很简单。当然,如果用户的网络中断,或者浏览器崩溃,你不会知道。

    如果您正在使用其他一些实时连接,例如 websockets,您可以将其定义为表示该套接字是否打开。 Websocket 实现通常具有某种可以在服务器端读取的状态属性(例如 gevent-websocket 套接字有一个布尔属性 .close 可以检查)

    如果你走心跳路线,你可能最终会使用 setInterval 回调在 Javascript 中触发它,并在服务器上编写某种定时进程以在一段时间内没有得到时采取一些行动。

    【讨论】:

      【解决方案4】:

      要做到这一点,您需要在每个用户登录时使用异步连接。查看Tornadi,它比烧瓶更适合此类应用程序。但是如果你坚持使用 Flask,你就必须想办法使用 Tornado 来实现系统的异步部分,并让它与 Flask 共存。如果您不想使用 Tornado,也可以使用 Python's asyncio module,但您必须从头开始创建所有内容,这在大多数情况下并不理想。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 2023-03-13
        • 2016-09-14
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        相关资源
        最近更新 更多