Google App Engine или другие изменения требуют перезагрузки модуля - PullRequest
2 голосов
/ 02 апреля 2012

Я пытался изменить правила 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@b.c'
        user = users.get_current_user()
        self.response.out.write(user.email())

Это не работает. get_current_user() возвращает None в приведенном выше примере для меня, по крайней мере, при работе на сервере 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'] = 'a@b.c'
        reload(users)
        user = users.get_current_user()
        self.response.out.write(user.email())

Единственным изменением была перезагрузка пользовательского модуля после изменения os.environ. Это ожидаемое поведение или что-то не так с моим App Engine? Насколько я понимаю, Python / App Engine должен загружать только одну копию ОС, загруженную в систему, а не две.

Есть идеи? Это очень смущает меня.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Ты почти у цели. Вам нужно передать 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)
1 голос
/ 03 апреля 2012

Чтобы уточнить, os.environ - это среда WSGI (или CGI для Python 2.5), которая передается в вашу WSGI-совместимую среду (в вашем случае webapp2 ) длязапрос, который вы обрабатываете - так что только одна среда на запрос.

Вы можете увидеть пример всех значений WSGI, посетив http://foo -shop.appspot.com -это простое приложение WSGI на Python 2.7, которое показывает все значения WSGI.И все значения USER_ *, кажется, являются специфическими для использования учетных записей 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 () для изменения переменных окружения специально для тестирования ... и я думаю, что только для тестирования.Это не то, что приложение должно делать в непроверенных условиях.

...