Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django sessionid从Cookie中消失,用户变得匿名_Django_Firebase_Google App Engine_Python 3.6 - Fatal编程技术网

Django sessionid从Cookie中消失,用户变得匿名

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,有时有效,有时无效。当它工作时,它会在主

我已经使用Django开发了一个web应用程序,使用Firebase(通过Pyrebase python包装器访问)作为数据库,并且刚刚使用GoogleAppEngine部署了它

我在sessionid上有问题,但只有在web服务器上,而不是在本地运行应用程序时

web服务器上发生的事情是,一旦用户通过身份验证,用户的ID令牌将通过
请求存储在会话字典中。会话['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

@杰里米·库尔切克,如果这个答案有用,你能接受吗?谢谢