0

Flask-Login を使用してユーザーをログインさせており、Flask アプリから手動でログアウトする前にブラウザーを閉じた場合に、ユーザーをログアウトできるようにしたいと考えていました (セッション時間を追跡したい)。

これは、Flask-SocketIO で実行できます。

@socketio.on('disconnect')
def disconnect_user():
    if current_user.is_authenticated:
        logged_out = logout_user()
        logger.debug('logged_out OK: {0}, current_user.is_authenticated: {1}'.format(logged_out, current_user.is_authenticated))

NB SocketIO のドキュメントに従ってクライアント JS を実行する必要があります。

ブラウザーを閉じてから約 1 分後に、disconnect_user メソッドが実行され、「logged_out OK: True, current_user.is_authenticated: False」と出力されます。すべて問題ありませんが、ブラウザーを再度開いて、以下のように current_user.is_authenticated を呼び出すと、True が返されます。

home.html:

<ul class="nav navbar-nav">
    {% if not current_user.is_authenticated %}
        <li ><a href="{{ url_for('view.index') }}">Index</a></li>
    {% else %}
        <li><a href="{{ url_for('app.user_link') }}">User link</a></li>
    {% endif %}
  </ul>

current_user.is_authenticated が明らかに False であり、同じサーバー セッションで異なるブラウザー セッションに対して True を返すのは奇妙に思えます。何が起こっているのか、これを回避する方法はありますか?

要求されたログインおよびユーザー モデル コード:

@auth_view.route("/login", methods=["GET", "POST"])
def login():
    if current_user is not None and current_user.is_authenticated:
        flash("Already logged in.", 'info')
        return redirect(url_for('main_view.index'))
    form = LoginForm(request.form)
    if form.validate_on_submit():
        #find user in db then
        login_user(user)

def User(Base):
    id = Column(Integer, primary_key=True)
    email = Column(String, unique=True)
    name = Column(String(255))
    #password code here

    def get_id(self):
        return str(self.id)

    def is_active(self):
        return self.active

    def is_anonymous(self):
        return False

    def is_authenticated(self):
        return True
4

0 に答える 0