Django APIView退出用户会话

时间:2018-12-17 15:46:52

标签: python django session django-rest-framework

我有一个从SSO服务调用的Django模块。该服务具有单一注销功能,该功能可在登录期间向指定的URL发出单个GET请求。

我正在尝试在Django中设置APIView来处理此注销。源服务从不检查响应。只会调用一次GET URL。

我正在为APIView尝试这样的操作,但不断出现session.DoesNotExist异常:

class LogoutApi(APIView):

    def get(self, request, *args, **kwargs):
        s = Session.objects.get(session_key=kwargs.get('sk', ''))
        s.delete()
        return Response({'result': True})

我知道我的会话有效,但是即使尝试遍历Session.objects时也找不到它。

我还尝试过从SessionStore提取密钥:

class LogoutApi(APIView):

    def get(self, request, *args, **kwargs):
        sk = request.GET.get('sk', '')
        try:
            s = SessionStore(sk)
            del s[sk]
            return Response({'result': True})
        except:
            self.logger.error(sys.exc_info()[0])
        return Response({'result': False})

它仍然没有成功。有什么方法可以设置GET API调用来终止特定会话?

1 个答案:

答案 0 :(得分:1)

原来的问题是会话引擎被设置为使用签名的cookie。从配置中删除以下行后,所有操作均按预期进行:

SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" # Removed this line

作为参考,这是使用上述设置的注销代码:

class LogoutApi(APIView):

    def get(self, request, *args, **kwargs):

        sk = request.GET.get('sk', '')
        if sk:
            s = SessionStore(session_key=sk)
            s.delete()
            return Response({'result': True})
        return Response({'result': False})