如何将数据传递到 GAE 基本模板?
Posted
技术标签:
【中文标题】如何将数据传递到 GAE 基本模板?【英文标题】:How can I pass data to a GAE base template? 【发布时间】:2011-10-09 13:45:33 【问题描述】:使用 Google App Engines webapp 框架,有没有办法将数据传递到基本模板? 具体来说,我只想在用户登录时显示一个注销按钮(使用谷歌自己的身份验证系统)。
我还在学习,所以我不确定哪些部分是 GAE 特有的,哪些部分是 django 特有的;必须从每个请求处理程序发送登录用户似乎非常不干。
【问题讨论】:
【参考方案1】:基本模板的参数与任何其他模板参数的传递方式相同,通过传递给 template.render。我通常通过在我的基本处理程序上使用插入常用模板参数的便捷方法来解决这个问题,如下所示:
class BaseHandler(webapp.RequestHandler):
def render_template(self, filename, template_args):
path = os.path.join(os.path.dirname(__file__), 'templates', filename)
template_args.update(
'user': users.get_current_user(),
# ...
)
class MyHandler(BaseHandler):
def get(self):
self.render_template('my.html', 'foo': 'bar')
【讨论】:
【参考方案2】:我认为您正在寻找类似login_required decorator in django 的东西。您可以尝试使用完整的django framework in GAE(我从未尝试过),也可以使用decoration 轻松自定义并添加您自己的行为。在您的情况下,最好将用户的登录状态传递给模板引擎。
#the decorator
def login_checked(f):
def wrap(request, *args, **kwargs):
# get current user
user = get_current_user()
template_path, vars = f(request, *args, **kwargs)
vars['user']= user
template.render(template_path, vars)
return wrap
# usage
class MyPage(webapp.RequestHandler):
@login_checked # add a decoration
def get(self):
# your page
return "the_template_page_you_want", "the value you want to pass to template": "xxx"
【讨论】:
【参考方案3】:看看这个例子:
from google.appengine.api import users
class MyHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
greeting = ("Welcome, %s! (<a href=\"%s\">sign out</a>)" %
(user.nickname(), users.create_logout_url("/")))
else:
greeting = ("<a href=\"%s\">Sign in or register</a>." %
users.create_login_url("/"))
self.response.out.write("<html><body>%s</body></html>" % greeting)
来源:http://code.google.com/appengine/docs/python/users/loginurls.html
【讨论】:
由于问题是明确的模板,这真的没有帮助。以上是关于如何将数据传递到 GAE 基本模板?的主要内容,如果未能解决你的问题,请参考以下文章