我试图更改 os.environ 字典来模拟 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'] = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f594b597db96" rel="noreferrer noopener nofollow">[email protected]</a>'
user = users.get_current_user()
self.response.out.write(user.email())
这行不通。 get_current_user()
在上面的示例中对我来说返回 None ,至少在开发服务器上运行时是这样。使用 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'] = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7a1b3a185419" rel="noreferrer noopener nofollow">[email protected]</a>'
reload(users)
user = users.get_current_user()
self.response.out.write(user.email())
唯一的变化是在更改 os.environ 后重新加载用户模块。这是预期的行为,还是我的 App Engine 设置有问题?我的理解是,Python/App Engine 应该只加载加载到系统中的 os 模块的一份副本,而不是两份。
有什么想法吗?这让我很困惑。
最佳答案
你就快到了。您需要的是将 overwrite=True
传递给 testbed.setup_env()
。
我通常会创建一个“帮助器”方法,例如login_user
,类似这样:
def login_user(self, email, user_id, is_admin=False):
self.testbed.setup_env(user_email=email or '', overwrite=True)
self.testbed.setup_env(user_id=str(user_id) or '', overwrite=True)
self.testbed.setup_env(user_is_admin='1' if is_admin else '0', overwrite=True)
def logout_user(self):
self.login_user(None, None)
也适用于 OAuth(如果您也需要):
def login_user(self, email, user_id, is_admin=False):
self.testbed.setup_env(oauth_error_code='', overwrite=True)
self.testbed.setup_env(oauth_email=email, overwrite=True)
self.testbed.setup_env(oauth_user_id=str(user_id) or '', overwrite=True)
self.testbed.setup_env(oauth_auth_domain='example.com', overwrite=True)
self.testbed.setup_env(oauth_is_admin='1' if is_admin else '0', overwrite=True)
关于python - Google App Engine os.environ 更改需要重新加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9974671/