【发布时间】:2023-03-27 23:39:01
【问题描述】:
我有一个从 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 调用来终止特定会话?
【问题讨论】:
-
MIDDLEWARE设置中的会话中间件是否处于活动状态?还是您在登录时以某种方式创建会话? -
我的中间件列表中确实有
django.contrib.sessions.middleware.SessionMiddleware处于活动状态。 -
这很奇怪,如果您在登录时有中间件,则应该创建一个 Session 对象。尝试调试会话中间件代码,看看使用什么键来创建会话。
-
你确定你有一个会话吗?通过 API 端点登录时不会创建会话。基于令牌的身份验证是无状态的。例如,当您使用浏览器登录 API 时,会使用基于会话的身份验证。你是怎么登录的?
-
用户通过SSO站点登录。然后他们打开一个使用 OAuth 登录 Django 站点的页面。我在登录时将一堆值存储到用户会话
self.request.session['user_name'] = request.GET.get('user_name', None)中。这就是我要清除的会话数据。
标签: python django session django-rest-framework