谷歌应用程序引擎:用户API的困难(或者可能只是Python语法问题)

谷歌应用程序引擎:用户API的困难(或者可能只是Python语法问题),python,google-app-engine,syntax,Python,Google App Engine,Syntax,我有一个简单的GAE应用程序,包括一个登录/注销链接。此应用程序目前正在dev服务器上运行 基本页处理程序获取当前用户,并相应地创建登录/注销url。然后,它将这些信息放入\u模板\u数据字典中,以方便子类 class BasePage(webapp.RequestHandler): _user = users.get_current_user() _login_logout_link = None if _user: _login_logout_link

我有一个简单的GAE应用程序,包括一个登录/注销链接。此应用程序目前正在dev服务器上运行

基本页处理程序获取当前用户,并相应地创建登录/注销url。然后,它将这些信息放入
\u模板\u数据
字典中,以方便子类

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登录/注销页面。然而,这似乎没有任何影响-服务器似乎仍然认为用户已注销。我做错了什么?

我认为问题在于
\u user
属性

当前,在导入包含类的模块时(可能在应用程序启动时),会绑定
\u 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\u logout\u link
。在子类中,可以使用数据参数向模板传递额外值(
template\u data.update(data)
使用
data
字典中的键/值对更新
template\u data
字典)

子类示例:

class MainPage(BasePage):
    def get(self):
        self.render('start', data={"now": datetime.now()})