我试图将os.environ dict更改为在Google App Engine上模拟登录用户,如https://stackoverflow.com/a/6230083/1241454中所述。
from google.appengine.api import users
import webapp2
import os
class TestPage(webapp2.RequestHandler):
def get(self):
os.environ['USER_EMAIL'] = '[email protected]'
user = users.get_current_user()
self.response.out.write(user.email())
这不管用。
get_current_user()
对于我来说,至少在dev服务器上运行时,在上面的示例中不返回任何值。当使用testbed.setup_env()
而不是直接编辑os.environ时,我得到了相同的结果。但是,以下方法确实有效:from google.appengine.api import users
import webapp2
import os
class TestPage(webapp2.RequestHandler):
def get(self):
os.environ['USER_EMAIL'] = '[email protected]'
reload(users)
user = users.get_current_user()
self.response.out.write(user.email())
唯一的更改是在更改os.environ之后重新加载用户模块。这是预期的行为,还是我的应用程序引擎设置有问题?我的理解是Python/App Engine应该只加载加载到系统中的os模块的一个副本,而不是两个。
有什么想法吗?这让我很困惑。
最佳答案
为了澄清这一点,os.environ是WSGI环境(或Python 2.5的CGI),它将被传递给您正在处理的请求的WSGI兼容框架(在您的例子中是webapp2),因此每个请求只有一个环境。
通过访问http://foo-shop.appspot.com,您可以看到所有WSGI值的示例-这是Python 2.7上的一个简单WSGI应用程序,它显示了所有WSGI值。而且所有的用户值似乎都是特定于使用Google帐户进行身份验证的。在http://www.wsgi.org/en/latest/definitions.html没有提到他们。
在https://developers.google.com/appengine/docs/python/tools/localunittesting#Changing_the_Default_Environment_Variables,文档建议使用self.setup_env()来更改专门用于测试的环境变量…我认为只进行测试。这不是应用程序在非测试环境中应该做的事情。
关于python - Google App Engine os.environ更改需要重新加载模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9974671/