两个Django应用程序(DRF)在具有相同主机localhost的两个单独的端口8001和8000上运行。我正在使用memcached存储会话。两个应用程序共享来自内存缓存的会话。当我第一次使用登录后尝试使用第二个应用程序访问页面时,出现错误:
“ 在请求完成之前删除了该请求的会话。例如,用户可能已在并发请求中注销。”
我想构建一个分布式应用程序,其中一个应用程序可以用于在单独的docker上运行的身份验证,以便其他应用程序可以使用memcached共享会话
Sessionmiddleware能够在Request对象中填充会话对象,但是在AuthenticationMiddleware中执行以下代码行之后 request.user = SimpleLazyObject(lambda:get_user(request)) session._session字典元素已删除。
答案 0 :(得分:0)
在上述情况下,您正在具有相同数据库的两个不同端口上运行应用程序。如果user1
使用端口8000
登录,则将为他创建一个会话。并再次user1
使用端口8001
登录,然后现有会话将被新会话替换/破坏。因为浏览器将localhost:8000
和localhost: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将不会被更改。