首页 > 解决方案 > Django APIView 注销用户会话

问题描述

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

APIView我正在尝试在 Django 中设置一个来处理此注销。源服务从不检查响应;它只调用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})

它仍然没有成功。有没有办法可以设置GETAPI 调用来终止特定会话?

标签: pythondjangosessiondjango-rest-framework

解决方案


原来问题在于会话引擎被设置为使用签名的 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})

推荐阅读