Google App Engine: трудности с API пользователей (или, возможно, просто проблема с синтаксисом Python) - PullRequest
1 голос
/ 07 апреля 2010

У меня есть простое приложение GAE, которое включает в себя ссылку для входа / выхода.В настоящий момент это приложение работает на сервере разработчиков.

Обработчик базовой страницы получает текущего пользователя и соответствующим образом создает URL для входа / выхода из системы.Затем она помещает эту информацию в словарь _template_data для удобства подклассов.

class BasePage(webapp.RequestHandler):
    _user = users.get_current_user()
    _login_logout_link = None
    if _user:
        _login_logout_link = users.create_logout_url('/')
    else:
        _login_logout_link = users.create_login_url('/')

    _template_data = {}
    _template_data['login_logout_link'] = _login_logout_link
    _template_data['user'] = _user

    def render(self, templateName, templateData):
        path = os.path.join(os.path.dirname(__file__), 'Static/Templates/%s.html' % templateName)
        self.response.out.write(template.render(path, templateData)) 

Вот один из таких подклассов:

class MainPage(BasePage):
    def get(self):
        self.render('start', self._template_data)

Ссылка для входа / выхода отображается нормально,и перейти на правильную страницу входа / выхода devserver.Однако, похоже, что это не имеет никакого эффекта - сервер все еще думает, что пользователь вышел из системы.Что я тут не так делаю?

1 Ответ

2 голосов
/ 07 апреля 2010

Мне кажется, проблема в атрибуте _user.

В настоящее время атрибут _user связывается при импорте модуля, содержащего класс (возможно, при запуске приложения). Вам нужно получить текущего пользователя для каждого запроса.

Я бы переписал что-то вроде:

class BasePage(webapp.RequestHandler):
    def render(self, template_name, data={}):
        template_data = {}
        user = template_data["user"] = users.get_current_user()
        template_data["login_logout_link"] = users.create_logout_url() if user else users.create_login_url()
        template_data.update(data)
        path = os.path.join(os.path.dirname(__file__), 'Static', 'Templates', '%s.html' % template_name)
        self.response.out.write(template.render(path, template_data)

В этом случае шаблоны всегда будут получать значения user и login_logout_link. В подклассе вы можете передавать дополнительные значения в шаблон с помощью аргумента данных (template_data.update(data) обновляет словарь template_data ключом пары / значение из словаря data).

Пример подкласса:

class MainPage(BasePage):
    def get(self):
        self.render('start', data={"now": datetime.now()})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...