我有一个从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调用来终止特定会话?
答案 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})