如何将数据传递到 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 基本模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同的数据从视图传递到模板?

如何将参数从谷歌作曲家传递到数据流模板

如何在 GAE 模板中获取当前页面的 url

如何将数据值从视图传递到 Django 中的模板?

如何将模板中的动态表传递给我的视图以迭代地将它们保存到我的数据库中

如何在模板中将数据从 Flask 传递到 JavaScript?