python - Google App Engine os.environ 更改需要重新加载模块

标签 python google-app-engine testbed

我试图更改 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/

相关文章:

python - 如何创建新的 CSV 文件并将其存储在 Google Cloud Storage 中?

python - Google App Engine 数据存储中的实体组

python - 在 app.yaml 中使用登录设置对 gae 进行单元测试

python - 简单的网络爬虫非常慢

python - 使用 Blender 中嵌入的 Python 解码 URL

python - 为什么 "bare"CPU 上的 Keras 模型更快?

java - Google App Engine java OutOfMemoryError when putAll on memcache

google-app-engine - Google App Engine - 安全 Cookie

Angular9 debugElement.classes ['my-class'] 现在返回未定义

angular - 如何在 Angular/Jasmine 测试中模拟 Injector 实例?