Python 由于多个并发请求,Django会话cookie丢失

Python 由于多个并发请求,Django会话cookie丢失,python,django,session,cookies,Python,Django,Session,Cookies,我正在构建一个应用程序,在这个应用程序中,客户机时不时地ping服务器(我们不必讨论原因)。当服务器处理这些请求时,它会检查客户端是否使用request.user.is_authenticated()登录 它看起来像这样: def handle_ping_request(request): if request.user.is_authenticated(): # Do something... else: # Do Something else...

我正在构建一个应用程序,在这个应用程序中,客户机时不时地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)
你对如何避免这个问题有什么建议吗?最好不涉及客户


谢谢。

在服务器上处理这个问题可能太麻烦了,因为您必须创建某种信号量系统,该系统还将尝试猜测当前是否有任何ping来自正在进行身份验证的客户端。我的建议是,在客户端等待对其登录请求的响应时,只需将客户端代码更改为不ping即可。

您可以创建保留相同会话id的替代标准,而不是生成新的会话id,或者使用不生成新密钥的自定义身份验证后端,或者通过创建一个自定义会话后端来重写,以重用相同的密钥

但是:想一想,通过重用同一会话密钥,您可能会对自己开放什么-取决于此系统的使用位置,您将使自己更容易受到会话劫持(即:只有一个会话id可嗅探),以及缓存可能返回未经验证的页面内容而不是验证页面内容的潜在问题,因为sessionid在技术上是相同的,缓存无法区分这两种情况之间的差异,等等


简而言之:默认情况下,它的工作方式是有原因的。

如果客户端在登录之前ping,则登录请求可能在ping请求之前到达服务器。这意味着客户端在发送登录请求之前还必须等待所有ping请求完成。这似乎也是一种信号量机制:)没错,但至少客户机只有一个可精确识别的服务器,而服务器必须在所有当前会话的整个大草堆中找到客户机的几个“针”会话,这似乎是一项更大的任务。