view genshi_view/template/+package+/handlers.py @ 8:af07c17c7b2f

pass app to Index handler
author k0s <k0scist@gmail.com>
date Fri, 06 Nov 2009 16:53:32 -0500
parents 86df7b4dbc9c
children cb8ebcb8b4fd
line wrap: on
line source

from urlparse import urlparse
from webob import Response, exc

class HandlerMatchException(Exception):
    """the handler doesn't match the request"""

class Handler(object):

    methods = set(['GET']) # methods to listen to
    handler_path = [] # path elements to match        

    @classmethod
    def match(cls, app, request):
        try:
            return cls(app, request)
        except HandlerMatchException:
            return None
    
    def __init__(self, app, request):
        if request.method not in self.methods:
            raise HandlerMatchException
        self.path = request.path.info.strip('/').split('/')
        if self.path == ['']:
            self.path = []
        if path[:len(handler_path)] != self.handler_path:
            raise HandlerMatchException
        self.app = app
        self.request = request
        self.application_path = urlparse(request.application_url)[2]

    def link(self, path=(), permanant=False):
        if isinstance(path, basestring):
            path = [ path ]
        path = [ i.strip('/') for i in path ]
        if permanant:
            application_url = [ self.request.application_url ]
        else:
            application_url = [ self.application_path ]
        path = application_url + path
        return '/'.join(path)

    def redirect(self, location):
        raise exc.HTTPSeeOther(location=location)

class GenshiHandler(Handler):

    def __init__(self, app, request):
        Handler.__init__(self, request)
        self.data = { 'request': request }

    def __call__(self):        
        template = self.app.loader.load(self.template)
        return Response(content_type='text/html',
                        body=template.generate(**self.data).render())

class Index(GenshiHandler):
    template = 'index.html'