Ich versuche, eine base request handling
Klasse zu definieren, so dass die Webapp-Seiten einige grundlegende Methoden und Variablen erben, die sonst für jede Seite der Anwendung wiederholt definiert werden müssten. Eine Art ähnlicher Funktionalität wie django preprocessors
. Das ist meine Basisklasse, von der anderen Seiten erben:Google App Engine, definieren Sie eine Vorlaufklasse
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
Alles funktioniert, außer in Ordnung, dass ich nicht einige Variablen während der Initialisierung passieren kann als self.request nicht verfügbar ist. Für eine Problemumgehung habe ich also eine ganze Eigenvariable als Template-Variable übergeben.
Gibt es eine andere Möglichkeit, die Template-Variablen (request, logout_url usw.) den Templates zur Verfügung zu stellen?
danke! Ich dachte in Zeilen der Definition benutzerdefinierte get, Beiträge in der Basisklasse und mit super(), aber diese DoPost, DoGet scheint toll !! Ich denke, das ist gut für mein kleines Projekt, das nicht viele Django-Features benötigt. – crodjer
@dcrodjer - ausgezeichnet! – bgporter