ウェブアプリケーションページがアプリケーションの各ページで繰り返し定義される必要があるいくつかの基本メソッドと変数を継承するように、base request handling
クラスを定義しようとしています。類似の機能の一種、django preprocessors
のようなもの。Google App Engineで前処理クラスを定義
class BasePage(webapp.RequestHandler):
def __init__(self):
self.user = users.get_current_user()
self.template_values = {
'user': self.user,
'environ': self, #I don't like the idea of passing the whole environ object to a template
##The below three functions cannot be executed during _init_ because of absence of self.request
#'openid_providers': self.openid_providers(),
#'logout_url': self.get_logout_url(),
#'request': self.get_request(),
}
##A sort of similar functionality like render_to_response in django
def render_template(self, template_name, values = None, *args, **kwargs):
#PATH is the directory containing the templates
if values:
for value in values: self.template_values[value] = values[value]
self.response.out.write(template.render(PATH+template_name, self.template_values, *args, **kwargs))
##Returns request as the name suggests
def logout_url(self):
return users.create_logout_url(self.request.url)
##Returns request as the name suggests
def request(self):
return request
##Returns openid login urls
def openid_providers(self):
#OPENID_POVIDERS is a list of dictionary
for p in OPENID_PROVIDERS:
p['login_url'] = users.create_login_url(self.request.get('next', '/') , p['name'], p['url'])
return OPENID_PROVIDERS
すべてがself.requestが利用できないように私は、初期化中に、いくつかの変数を渡すことができないことを除いて正常に動作している:これは、他のページが継承する私の基本クラスです。だから私がやった回避策はテンプレート変数として全体の自己変数を渡すことです。
テンプレート変数(request、logout_urlなど)をテンプレートに提供する他の方法はありますか?私は基本的にTemplate Method Pattern
を使用して、私のAppEngineのコードでは、その問題を解決し、基底クラスがどのように見えるまし
ありがとうございます!私はカスタムクラスを定義し、ベースクラスのポストを定義し、super()を使用していると考えていましたが、このDoPost、DoGetは素晴らしいようです!!私はこれが多くのdjangoの機能を必要としない私の小さなプロジェクトには良いと思う。 – crodjer
@dcrodjer - 優秀! – bgporter