如何将数据传递到GAE基本模板?

时间:2011-07-20 16:39:13

标签: google-app-engine inheritance django-templates

使用Google App Engines webapp框架,有没有办法将数据传递到基本模板? 具体来说,我只想在用户登录时看到注销按钮(使用googles自己的身份验证系统)。

我还在学习,所以我不确定哪些部分是GAE特定的,哪些部分是django特定的;必须从每个请求处理程序发送登录用户似乎非常干。

3 个答案:

答案 0 :(得分:3)

通过传递给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'})

答案 1 :(得分:0)

我认为你正在寻找像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"}

答案 2 :(得分:-2)

看一下这个例子:

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