from os.path import join, dirname from google.appengine.ext.webapp import template, RequestHandler class Renderer: def render(self, path, dic): return template.render(join(dirname(__file__), path), dic) class GetReceiver: def __init__(self, form, data): self.form = form self.data = data def get(self): return Renderer().render(self.form, self.data.get()) class AbstractProcessor: def proc(self, request): # template method return self.todict(self.model.proc(self.parse(request))) class PostReceiver: def __init__(self, view, proc): self.view = view self.proc = proc def post(self, request): return Renderer().render(self.view, self.proc.proc(request)) class Output(RequestHandler): def get(self): self.response.out.write(self.getReceiver.get()) def post(self): self.response.out.write(self.postReceiver.post(self.request)) # implement below class ConcreteGetter: def get(self): return # something from database class ConcreteProcessingModel: def proc(self, arg): return # something from database class ConcreteProcessor(AbstractProcessor): def __init__(self): self.model = ConcreteProcessingModel() def parse(self, request): return # something from request def todict(self, result): return # dictionary from result class ConcreteRequestHandler(Output): def __init__(self): self.getReceiver = GetReceiver('input_hoge.html', ConcreteGetter()) self.postReceiver = PostReceiver('view_hoge.html', ConcreteProcessor())