首页 > 解决方案 > 用户通过 chrome 自动登录时出现“会话匹配查询不存在”错误

问题描述

错误页面

当用户通过 chrome 自动登录时,网站出现“会话匹配查询不存在”错误。该错误发生在确保用户无法在不同浏览器中登录的中间件中。

from django.contrib.sessions.models import Session


class OneSessionPerUser:
def __init__(self, get_response):
    self.get_response = get_response
    # One-time configuration and initialization.

def __call__(self, request):
    # Code to be executed for each request before
    # the view (and later middleware) are called.
    if request.user.is_authenticated:
        current_session_key = request.user.logged_in_user.session_key

        if current_session_key and current_session_key != request.session.session_key:
            Session.objects.get(session_key=current_session_key).delete()

        request.user.logged_in_user.session_key = request.session.session_key
        request.user.logged_in_user.save()

    response = self.get_response(request)

    # Code to be executed for each request/response after
    # the view is called.

    return response

有人知道这里可能是什么问题,或者有人知道如何禁用 chrome 自动登录吗?

标签: pythondjangogoogle-chromedjango-modelsgoogle-chrome-devtools

解决方案


问题在这里:

  if current_session_key and current_session_key != request.session.session_key:
            Session.objects.get(session_key=current_session_key).delete()

我遇到了同样的问题,据我了解,您应该更改 get for 过滤器。因为如果 get 没有得到答案,他就会抛出这个错误。使用过滤器,过滤器可以是一个空查询。所以我做了:

if current_session_key and current_session_key != request.session.session_key:
        Session.objects.filter(session_key=current_session_key).delete()

在此之后,一切都很好。没有更多奇怪的错误。

编辑:

在我的伙伴提出了一些好的观点之后,发生的事情是会话密钥被删除或销毁,所以,当你应用 get 时,它没有得到答案,因为没有空值可以得到,这就是它吐出的原因错误。使用过滤器,您仍在搜索空值,但在这种情况下,您可以获得空查询,并且由于值是唯一的,您不会一次取出两个会话。

对不起,如果我的英语不好,这不是我的第一语言。


推荐阅读