# HG changeset patch # User k0s # Date 1257652186 18000 # Node ID 8a7731b2126a11e12f9360c1baad666794e204c4 # Parent ffdfb79b30bff1fe9b79ad9b8c4c815750711b22 include a post method, a nav bar, and some jquery fun diff -r ffdfb79b30bf -r 8a7731b2126a genshi_view/template/+package+/dispatcher.py --- a/genshi_view/template/+package+/dispatcher.py Fri Nov 06 16:58:51 2009 -0500 +++ b/genshi_view/template/+package+/dispatcher.py Sat Nov 07 22:49:46 2009 -0500 @@ -1,5 +1,6 @@ """ -request dispatcher +request dispatcher: +data persisting across requests should go here """ import os @@ -14,7 +15,8 @@ class Dispatcher(object): ### class level variables - defaults = { 'auto_reload': 'False'} + defaults = { 'auto_reload': 'False', + 'name': 'anonymous' } def __init__(self, **kw): @@ -28,21 +30,22 @@ # static files self.htdocs = resource_filename(__name__, 'static') - # template loader # to move??? + # template loader templates_dir = resource_filename(__name__, 'templates') self.loader = TemplateLoader(templates_dir, auto_reload=self.auto_reload) ### methods dealing with HTTP def __call__(self, environ, start_response): + + # get a request object request = Request(environ) - # serve static files - # TODO: put into a handler - filename = os.path.join(self.htdocs, request.path_info) - if request.path_info != '/' and os.path.exists(filename): - fileapp = FileApp(filename) - return fileapp(environ, start_response) + # get the path + path = request.path_info.strip('/').split('/') + if path == ['']: + path = [] + request.environ['path'] = path # match the request to a handler for h in self.handlers: @@ -52,6 +55,13 @@ else: handler = exc.HTTPNotFound + # add navigation links to handler [example] + handler.data.setdefault('links', []) + for h in self.handlers: + handler.data['links'].append((handler.link(h.handler_path), + h.__name__)) + + # get response res = handler() return res(environ, start_response) diff -r ffdfb79b30bf -r 8a7731b2126a genshi_view/template/+package+/factory.py_tmpl --- a/genshi_view/template/+package+/factory.py_tmpl Fri Nov 06 16:58:51 2009 -0500 +++ b/genshi_view/template/+package+/factory.py_tmpl Sat Nov 07 22:49:46 2009 -0500 @@ -7,7 +7,6 @@ class PassthroughFileserver(object): """serve files if they exist""" - # XXX needed??? def __init__(self, app, directory): self.app = app diff -r ffdfb79b30bf -r 8a7731b2126a genshi_view/template/+package+/handlers.py --- a/genshi_view/template/+package+/handlers.py Fri Nov 06 16:58:51 2009 -0500 +++ b/genshi_view/template/+package+/handlers.py Sat Nov 07 22:49:46 2009 -0500 @@ -1,3 +1,8 @@ +""" +request handlers: +these are instantiated for every request, then called +""" + from urlparse import urlparse from webob import Response, exc @@ -17,13 +22,15 @@ return None def __init__(self, app, request): + + # check the method if request.method not in self.methods: raise HandlerMatchException - self.path = request.path_info.strip('/').split('/') - if self.path == ['']: - self.path = [] - if self.path[:len(self.handler_path)] != self.handler_path: + + # check the path + if request.environ['path'][:len(self.handler_path)] != self.handler_path: raise HandlerMatchException + self.app = app self.request = request self.application_path = urlparse(request.application_url)[2] @@ -46,13 +53,29 @@ def __init__(self, app, request): Handler.__init__(self, app, request) - self.data = { 'request': request } + self.data = { 'request': request, + 'link': self.link } - def __call__(self): + def __call__(self): + return getattr(self, self.request.method.title())() + + def Get(self): + # needs to have self.template set template = self.app.loader.load(self.template) return Response(content_type='text/html', - body=template.generate(**self.data).render()) + body=template.generate(**self.data).render('html')) class Index(GenshiHandler): template = 'index.html' + methods=set(['GET', 'POST']) + def __init__(self, app, request): + GenshiHandler.__init__(self, app, request) + + def Get(self): + self.data['name'] = self.request.remote_user or self.app.name + return GenshiHandler.Get(self) + + def Post(self): + self.app.name = self.request.POST.get('name', self.app.name) + self.redirect(self.link(self.handler_path)) diff -r ffdfb79b30bf -r 8a7731b2126a genshi_view/template/+package+/templates/index.html --- a/genshi_view/template/+package+/templates/index.html Fri Nov 06 16:58:51 2009 -0500 +++ b/genshi_view/template/+package+/templates/index.html Sat Nov 07 22:49:46 2009 -0500 @@ -2,13 +2,21 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + xmlns:py="http://genshi.edgewall.org/" + xmlns:xi="http://www.w3.org/2001/XInclude"> Hello world - + + - -Hello ${request.remote_user or 'world'}! + +Hello ${name}!