comparison wordstream/dispatcher.py @ 0:8af3412e907a

initial import of wordstream
author k0s <k0scist@gmail.com>
date Fri, 01 Jan 2010 19:35:32 -0500
parents
children e21f53582267
comparison
equal deleted inserted replaced
-1:000000000000 0:8af3412e907a
1 """
2 request dispatcher:
3 data persisting across requests should go here
4 """
5
6 import os
7
8 from handlers import Index, Feed, Eat, ViewCorpus
9
10 from genshi.template import TemplateLoader
11 from paste.fileapp import FileApp
12 from pkg_resources import resource_filename
13 from webob import Request, Response, exc
14 from wordstream.api import Corpus
15
16 class Dispatcher(object):
17
18 ### class level variables
19 defaults = { 'auto_reload': 'False',
20 'template_dirs': '',
21 'seed': '' }
22
23 def __init__(self, **kw):
24
25 # set instance parameters from kw and defaults
26 for key in self.defaults:
27 setattr(self, key, kw.get(key, self.defaults[key]))
28 self.auto_reload = self.auto_reload.lower() == 'true'
29 self.corpus = Corpus()
30 self.corpus.feed_stuff(*self.seed.split())
31
32 # request handlers
33 self.handlers = [ Index, ViewCorpus, Feed, Eat ]
34
35 # template loader
36 self.template_dirs = self.template_dirs.split()
37 self.template_dirs.append(resource_filename(__name__, 'templates'))
38 self.loader = TemplateLoader(self.template_dirs,
39 auto_reload=self.auto_reload)
40
41 def __call__(self, environ, start_response):
42
43 # get a request object
44 request = Request(environ)
45
46 # get the path
47 path = request.path_info.strip('/').split('/')
48 if path == ['']:
49 path = []
50 request.environ['path'] = path
51
52 # match the request to a handler
53 for h in self.handlers:
54 handler = h.match(self, request)
55 if handler is not None:
56 break
57 else:
58 handler = exc.HTTPNotFound
59
60 # add navigation links to handler [example]
61 if hasattr(handler, 'data'):
62 handler.data.setdefault('links', [])
63 for h in self.handlers:
64 handler.data['links'].append((handler.link(h.handler_path),
65 h.__name__))
66
67 # get response
68 res = handler()
69 return res(environ, start_response)