使用Google App Engines webapp框架,有什麼方法可以將數據傳遞到基本模板?
具體來說,我只想讓一個註銷按鈕在用戶登錄時顯示(使用Google自己的認證系統)。如何將數據傳遞給GAE基礎模板?
我還在學習,所以我不確定哪些部件是GAE特定的,哪些部件是django特定的;不得不從每一個請求處理程序發送登錄用戶似乎非常幹。
使用Google App Engines webapp框架,有什麼方法可以將數據傳遞到基本模板?
具體來說,我只想讓一個註銷按鈕在用戶登錄時顯示(使用Google自己的認證系統)。如何將數據傳遞給GAE基礎模板?
我還在學習,所以我不確定哪些部件是GAE特定的,哪些部件是django特定的;不得不從每一個請求處理程序發送登錄用戶似乎非常幹。
參數傳遞給基本模板傳遞相同的方式與任何其他模板參數,通過傳遞給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'})
我認爲您正在尋找類似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"}
看看這個例子:
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
因爲問題是明確有關模板,這真的是沒有幫助的。 –