我正在构建一个应用程序,其中客户端不时地ping服务器(让我们不了解原因)。当服务器处理这些请求时,它会使用request.user.is_authenticated()
检查客户端是否已登录它看起来像这样:
def handle_ping_request(request):
if request.user.is_authenticated():
# Do something...
else:
# Do Something else...
我注意到有时服务器会立即收到一个登录请求,然后是ping请求(来自同一个用户)。然后,客户端成功登录,响应返回一个新的会话ID(登录用户)和(我猜)旧的会话ID(匿名用户)被删除。处理ping请求时,其请求包含旧的会话ID。因此,ping请求返回第三个会话ID,并且在客户端发出的下一个请求中,客户端不再登录。
我的登录代码如下所示:
if not request.user.is_authenticated():
user = auth.authenticate(...credentials...)
if user and user.is_active:
auth.login(request, user)
您对如何避免此问题有任何建议吗?最好不涉及客户。
感谢。
答案 0 :(得分:1)
在服务器上处理这个问题可能太麻烦了,因为你必须创建某种信号量系统,它也会尝试猜测当前是否有来自同样经过身份验证的客户端的ping。我的建议只是在等待对其登录请求的响应时更改客户端代码而不是ping。
答案 1 :(得分:0)
您可以通过使用不生成新密钥的自定义身份验证后端,或通过创建一个新密钥来创建标准contrib.auth.login method的替代方案,以保留相同的会话ID,而不是生成新的会话ID。自定义会话后端,它会覆盖cycle_key() method in contrib.sessions.base以重用相同的密钥。
但是:通过重用相同的会话密钥来考虑你可能会打开自己的东西 - 取决于这个系统在哪里使用,你会让自己对会话劫持更加开放(即:只有一个会话ID嗅探),以及缓存可能返回unauth页面内容而不是auth页面内容的潜在问题,因为sessionid在技术上是相同的,并且缓存无法区分两种情况等等,等等。
简而言之:默认情况下,它的工作原理是它的工作方式。