view genshi_view/template/+package+/dispatcher.py @ 2:b8e5471794b2

move to a dispatcher architecture
author k0s <k0scist@gmail.com>
date Thu, 05 Nov 2009 23:15:37 -0500
parents genshi_view/template/+package+/+package+.py_tmpl@d9519f40c177
children 0be8714e4d6a
line wrap: on
line source

"""
request dispatcher
"""

from handlers import Index

from genshi.template import TemplateLoader
from paste.fileapp import FileApp
from pkg_resources import resource_filename
from webob import Request, Response, exc

class Dispatcher(object):

    ### class level variables
    defaults = { 'auto_reload': 'False'}

    def __init__(self, **kw):

        # set instance parameters from kw and defaults
        for key in self.defaults:
            setattr(self, key, kw.get(key, self.defaults[key]))
#        self.auto_reload = self.auto_reload.lower() == 'true'

        self.handlers = [ Index ]

        # static files
        self.htdocs = resource_filename(__name__, 'static')

        # template loader # to move???
#        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):
        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)

        # match the request to a handler
        for h in self.handlers:
            handler = h.match(request)
            if handler is not None:
                break
        else:
            handler = exc.HTTPNotFound

        res = handler()
        return res(environ, start_response)