Django Memcached会话被删除

时间:2019-03-04 11:14:43

标签: django django-rest-framework

两个Django应用程序(DRF)在具有相同主机localhost的两个单独的端口8001和8000上运行。我正在使用memcached存储会话。两个应用程序共享来自内存缓存的会话。当我第一次使用登录后尝试使用第二个应用程序访问页面时,出现错误:

在请求完成之前删除了该请求的会话。例如,用户可能已在并发请求中注销。”

我想构建一个分布式应用程序,其中一个应用程序可以用于在单独的docker上运行的身份验证,以便其他应用程序可以使用memcached共享会话

Sessionmiddleware能够在Request对象中填充会话对象,但是在AuthenticationMiddleware中执行以下代码行之后 request.user = SimpleLazyObject(lambda:get_user(request)) session._session字典元素已删除。

2 个答案:

答案 0 :(得分:0)

在上述情况下,您正在具有相同数据库的两个不同端口上运行应用程序。如果user1使用端口8000登录,则将为他创建一个会话。并再次user1使用端口8001登录,然后现有会话将被新会话替换/破坏。因为浏览器将localhost:8000localhost:8001视为两个不同的域。

为避免这种情况,您可以将nginx用作具有相同IP reverse proxy或域127.0.0.1的{​​{1}}服务器。现在,将api请求路由到端口localhost,将Web请求路由到端口8001

在上述情况下,域8000保持不变,因此localhost将不会替换现有会话。因此,它将起作用。

参考:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

答案 1 :(得分:0)

要解决此问题,我们需要在两个Django应用程序的设置中添加相同的密钥。 Django将用户添加到authmiddleware的请求正文中。该用户可以是匿名(未经身份验证)的用户,也可以是经过身份验证的用户。在将用户添加到请求中之前,将验证会话。验证过程如下。

session_hash_verified = session_hash和constant_time_compare(                     session_hash,                     user.get_session_auth_hash()                 )

此user.get_session_auth_hash()函数使用salted_hmac(key_salt,self.password).hexdigest()函数进行验证。 salted_hmac函数使用settings.SECRET_KEY来计算哈希值。如果两个应用程序的密钥都不相同,则会话hasj将不会被更改。