Mercurial > hg > wordstream
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) |