Django sessionid从Cookie中消失,用户变得匿名
我已经使用Django开发了一个web应用程序,使用Firebase(通过Pyrebase python包装器访问)作为数据库,并且刚刚使用GoogleAppEngine部署了它 我在sessionid上有问题,但只有在web服务器上,而不是在本地运行应用程序时 web服务器上发生的事情是,一旦用户通过身份验证,用户的ID令牌将通过Django sessionid从Cookie中消失,用户变得匿名,django,firebase,google-app-engine,python-3.6,Django,Firebase,Google App Engine,Python 3.6,我已经使用Django开发了一个web应用程序,使用Firebase(通过Pyrebase python包装器访问)作为数据库,并且刚刚使用GoogleAppEngine部署了它 我在sessionid上有问题,但只有在web服务器上,而不是在本地运行应用程序时 web服务器上发生的事情是,一旦用户通过身份验证,用户的ID令牌将通过请求存储在会话字典中。会话['uid']=idToken。当用户被引导到主页时,应用程序会尝试从会话字典中检索idToken,有时有效,有时无效。当它工作时,它会在主
请求存储在会话字典中。会话['uid']=idToken
。当用户被引导到主页时,应用程序会尝试从会话字典中检索idToken,有时有效,有时无效。当它工作时,它会在主页上加载一些用户数据,但当用户单击另一个页面时,它会继续随机工作或不工作
我注意到以下几点:
当我观看开发人员控制台的存储部分时,我看到会话存储和本地存储仍然是空的,而cookie携带sessionid和csrftoken变量。每次加载一个新页面时,sessionid都会被设置为一个新值——在本地运行时不会发生这种情况
最终,sessionid从cookie中消失,控制台中的错误报告用户实际上是匿名的。因此,要么用户登录并自动设置为匿名用户,要么登录并在几次单击后设置为匿名用户
我已尝试更改会话引擎/存储设置,但似乎没有任何效果
下面列出了错误消息的相关部分,这是用户登录并尝试从会话检索“uid”变量时引起的:
KeyError at /dashboard/loaduserdata
'uid'
Traceback:
File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
35. response = get_response(request)
File "/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vmagent/app/dashboard/views.py" in loaduserdata
64. idtoken = request.session['uid']
File "/env/lib/python3.6/site-packages/django/contrib/sessions/backends/base.py" in __getitem__
55. return self._session[key]
Exception Type: KeyError at /dashboard/loaduserdata
Exception Value: 'uid'
Request information:
USER: AnonymousUser
GET: No GET data
POST: No POST data
FILES: No FILES data
INSTALLED_APPS = ['dashboard', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles']
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SECURE = True
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_EXPIRE_SECONDS = 3600
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = True
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
非常感谢您的帮助,谢谢 运行本地应用程序,始终向同一服务器发送请求。对于水平扩展的系统,如AppEngine,当您发送请求时,负载平衡器可以将其重新路由到不同的实例。在这种情况下,需要使用独立的缓存,如 或者,通过支持,我们可以允许用户使用内存中的会话状态,而不是选择memcache 默认情况下,应用程序引擎将不使用会话关联。它可以通过生成的cookie按版本启用,而不会过期。 应用程序可能包含一组版本,其中一个、所有或无一个版本启用了会话关联:
app.yaml
network:
session_affinity: true | false
@杰里米·库尔切克,如果这个答案有用,你能接受吗?谢谢