亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django - 會話管理

Django - 會話管理

慕村225694 2021-11-30 15:56:38
我想防止同一個用戶帳戶在我的應用程序中具有多個活動會話,并遵循此問題的答案。我將其實現到我的models.py:from django.conf import settingsfrom django.db import modelsfrom django.contrib.sessions.models import Sessionclass UserSession(models.Model):    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)    session = models.OneToOneField(Session, on_delete=models.CASCADE)from django.contrib.auth import user_logged_infrom django.dispatch.dispatcher import receiver@receiver(user_logged_in)def remove_other_sessions(sender, user, request, **kwargs):    # remove other sessions    Session.objects.filter(usersession__user=user).delete()    # save current session    request.session.save()    # create a link from the user to the current session (for later removal)    UserSession.objects.get_or_create(        user=user,        session=Session.objects.get(pk=request.session.session_key)    )它工作得很好,但是,我注意到了一種奇怪的行為。如果我使用一個帳戶登錄,然后打開一個隱身窗口并使用相同的憑據登錄,第一個將被注銷(這正是我想要的)。但是,如果我使用帳戶登錄,然后關閉瀏覽器,下次我想登錄時,我會在行中收到錯誤消息:# save current sessionrequest.session.save()具有以下追溯(沒有太多信息..):更新錯誤在 /未提供異常消息控制臺日志顯示錯誤來自django.contrib.sessions.backends.base.UpdateError在此之后,如果我刷新頁面,則可以成功登錄。對可能發生的事情的任何見解?
查看完整描述

2 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

您收到該錯誤是因為數據庫中不再有要更新的會話,您已經刪除了其上方 2 行的所有活動會話。要解決這個問題,只需在清理它們時省略當前活動的會話:


@receiver(user_logged_in)

def remove_other_sessions(sender, user, request, **kwargs):

    # remove other sessions

    old_sessions = Session.objects.filter(usersession__user=user)

    if request.session.session_key:

        old_sessions = old_sessions.exclude(session_key=request.session.session_key)

    old_sessions.delete()


    # save current session

    request.session.save()


    # create a link from the user to the current session (for later removal)

    UserSession.objects.get_or_create(

        user=user,

        session=Session.objects.get(pk=request.session.session_key)

    )


查看完整回答
反對 回復 2021-11-30
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

@GwynBleidD 的回答很好!但這里有一個小錯誤:


if request.session.session_key:

        old_sessions = old_sessions.exclude(session_key=request.session.session_key)


應該寫成:


if request.session.session_key:

        old_sessions = old_sessions.exclude(session_key=request.session.session_key).delete()

else:

    old_sessions.delete()


否則當您第二次嘗試在同一臺計算機上登錄時會出現錯誤。


查看完整回答
反對 回復 2021-11-30
  • 2 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號