python - 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})
它仍然没有成功。有没有办法可以设置GET
API 调用来终止特定会话?
解决方案
原来问题在于会话引擎被设置为使用签名的 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})
推荐阅读
- excel - 微软 Excel。返回匹配的项目
- javascript - 已解决:在反应客户端过滤结果数组
- python - 有没有办法使用 python 将 .pdf 转换为 .csv?
- ansible - 如何使用ansible删除最旧的目录
- google-drive-api - Google Drive for File 中的域级隐私
- java - Android cursor = mydatabase.rawQuery 中断应用程序 - 信号 11
- laravel - Laravel 应用程序未在给定的 Elastic Beanstalk URL 上打开
- amazon-web-services - AWS ASG 启动模板和启动配置有什么区别?
- javascript - 推入数组中的项目并查看项目是否已存在
- rust - 如何在 rust 中使用 nom 解析对称引用字符串?