注销时为什么会话中的keyError?

时间:2014-11-19 21:02:05

标签: django

我在我的视图中设置了session["logID"]注册和登录功能,但是当我想在用户注销时将其保存在数据库中时,我在django中获得Loginstatus matching query does not exist.。这是views.py中的函数:

def loginProcess(request, email, password):
    try:
        user = authenticate(username=User.objects.get(email=email).username, password=password)
    except ObjectDoesNotExist:
        user = None
    if user is not None:
        # some code here for create LoginStatus model Object
        request.session["logID"] = newLoginStatus.id
        return showProfile(request)
    else:
        return homepage(request)

def logoutProcess(request):
    # ...
    userLoginStatus = Loginstatus.objects.get(pk=request.session.get("logID"))  # I got Error here
    userLoginStatus.sessionData = userSessionData
    userLoginStatus.save()
    logout(request)
    return redirect('/')

我在服务器中获得了Loginstatus matching query does not exist.,因此session["logID"]不存在!但我在loginProcess设置了它,userLoginStatus成功保存在DB中!我不明白会发生什么。

2 个答案:

答案 0 :(得分:0)

我通过在django shell中调试来解决我的问题。 django两次加载注销网址。第一次用户成功注销/logout/logout/,但第二次request.session将为空,然后行userLoginStatus = Loginstatus.objects.get(pk=request.session.get("logID"))抛出ObjectDoesNotExist例外,然后我使用tryexcept块更改代码:

def saveUserLoginStatusDetails(request):
    userSessionData = Session.objects.get(session_key=request.session.session_key).session_data
    userLoginStatus = Loginstatus.objects.get(logid=request.session.get("logID"))
    userLoginStatus.sessionData = userSessionData
    userLoginStatus.logout_date = datetime.now().date().isoformat()
    userLoginStatus.save()


def logoutProcess(request):
    try:
        saveUserLoginStatusDetails(request)
    except ObjectDoesNotExist:
        pass
    logout(request)
    return redirect('/')

答案 1 :(得分:0)

我解决了我的问题,在注销时遇到了同样的错误。

解决方法(除了keyerror) #Django #python #key 错误

def logout(request):
    try:
        if request.method == 'GET':
            del request.session['email']
            return redirect('login')
    except KeyError:
        return redirect('login')