我有一个简单的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登录/注销页面。但是,它似乎没有任何效果 - 服务器似乎仍然认为用户已注销。我在这里做错了什么?
答案 0 :(得分:2)
我认为问题是_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
。在子类中,您可以使用data参数将额外值传递给模板(template_data.update(data)
更新{ {1}}字典,包含template_data
字典中的键/值对。
子类示例:
data