diff --git a/simplewiki/dispatcher.py b/simplewiki/dispatcher.py --- a/simplewiki/dispatcher.py +++ b/simplewiki/dispatcher.py @@ -1,16 +1,16 @@ """ request dispatcher: data persisting across requests should go here """ import os -from handlers import GenshiRenderer, Index, Post +from handlers import GenshiRenderer, Index, Post, FileServer 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): @@ -25,17 +25,17 @@ class Dispatcher(object): # 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' assert self.directory and os.path.exists(self.directory), "Must specify an existing directory" # request handlers - self.handlers = [ Post, GenshiRenderer, Index ] + self.handlers = [ Post, GenshiRenderer, Index, FileServer ] # template loader self.template_dirs = self.template_dirs.split() self.template_dirs.append(resource_filename(__name__, 'templates')) self.loader = TemplateLoader(self.template_dirs, auto_reload=self.auto_reload) def __call__(self, environ, start_response): @@ -52,18 +52,11 @@ class Dispatcher(object): # match the request to a handler for h in self.handlers: handler = h.match(self, request) if handler is not None: break else: handler = exc.HTTPNotFound - # add navigation links to handler [example] - if hasattr(handler, 'data'): - 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 --git a/simplewiki/handlers.py b/simplewiki/handlers.py --- a/simplewiki/handlers.py +++ b/simplewiki/handlers.py @@ -1,14 +1,15 @@ """ request handlers: these are instantiated for every request, then called """ import os +from paste.fileapp import FileApp from urlparse import urlparse from webob import Response, exc class HandlerMatchException(Exception): """the handler doesn't match the request""" class Handler(object): @@ -137,8 +138,21 @@ class Post(Handler): self.filename = path f = file(self.filename, 'wb') f.write(self.file.file.read()) f.close() def __call__(self): self.redirect(self.location) + +class FileServer(Handler): + methods = set(['GET']) # methods to listen to + + def __init__(self, app, request): + Handler.__init__(self, app, request) + self.file = os.path.join(self.app.directory, *request.environ['path']) + if not os.path.exists(self.file): + raise HandlerMatchException + + def __call__(self): + return FileApp(self.file) +