Python 寻求启示-AppEngine中的全局变量(aeoid.get\u current\u user())

Python 寻求启示-AppEngine中的全局变量(aeoid.get\u current\u user()),python,google-app-engine,session,global-variables,Python,Google App Engine,Session,Global Variables,这可能是一个“Python Web编程101”问题,但我对aeoid项目()中的一些代码感到困惑。代码如下: _current_user = None def get_current_user(): """Returns the currently logged in user, or None if no user is logged in.""" global _current_user if not _current_user and 'aeoid.user'

这可能是一个“Python Web编程101”问题,但我对aeoid项目()中的一些代码感到困惑。代码如下:

_current_user = None

def get_current_user():
    """Returns the currently logged in user, or None if no user is logged in."""
    global _current_user

    if not _current_user and 'aeoid.user' in os.environ:
        _current_user = User(None, _from_model_key=os.environ['aeoid.user'])
    return _current_user
但我的理解是,全局变量是,呃,全局的!因此,来自不同用户的不同请求可以(潜在地)访问和更新相同的值,因此需要会话,以便存储每个用户的非全局变量。那么,在上面的代码中,是什么阻止一个请求相信当前用户是另一个请求设置的用户?很抱歉,如果这是基本的,这不是我认为的工作方式


谢谢

你不是唯一一个对appengine上的globals感到困惑的人。但是我知道os.environ对于每个请求都是唯一的,所以我认为这可以解释为什么这个代码工作正常。如果不是的话,可能是因为这个模块以某种方式获得了一个技巧,这也是我在项目中寻找动态设置的一个技巧。

App Engine Python运行时是单线程的-每个运行时实例一次只处理一个请求。因此,您可以使用全局变量作为请求特定的参数,只要您在每个请求开始时小心地重置它们,这样它们就不会将数据从一个请求泄漏到另一个请求。

Ah,好的。以前从来没有想过线程,总是看起来有点神秘,但我有点明白了。我还将werkzeug视为webapp的可能替代品,我想这就是werkzeug本地对象的意义所在,它是一个“线程本地”对象,在中间件级别进行清理,“请求本地”也是如此。谢谢你的回复。(我想做的是以某种方式能够做到
self.request.user
,而不必让应用程序担心该用户是如何通过身份验证的,无论是通过您自己的aeoid还是其他方式。)
您不是唯一一个对appengine上的globals感到困惑的人
总是很高兴知道一个人并不孤单!谢谢你的回复。