class URLDirectoryHandler(URLHandler): ALLOWED_EXTENSIONS = ('jpg', 'css', 'js', 'gif', 'less', 'html', 'htm') def __init__(self, url, path): super(URLDirectoryHandler, self).__init__(url + '/<filename:EOF>') self.path = Path(path) def urls(self, pattern): return [self.url(path.base) for path in self.path.find(pattern)] def directory_view(self, x, files, dirs): with x.html: with x.body: with x.div('DIRECTORIES') >> x.ul: for item in dirs: x.li << x.a(item.base, href=self.url(item.base)) with x.div('FILES') >> x.ul: for item in files: x.li << x.a(item.base, href=self.url(item.base)) def directory_handler(self, req, filename, path): files, dirs = [], [] for item in path.find(): (dirs if item.isdir() else files).append(item) return pyml_response(req, self.directory_view, files, dirs) def secure(self, req, filename): assert '/..' not in filename, filename assert '../' not in filename, filename if '.' in filename: _, ext = filename.rsplit('.', 1) assert ext in self.ALLOWED_EXTENSIONS, ext def handler(self, req, filename): self.secure(req, filename) path = self.path[filename].real() if path.isfile(): return file_response(req, path) if path.isdir(): return self.directory_handler(req, filename, path) raise URLError('The file does not exist.')
def __init__(self, url, path): super(URLDirectoryHandler, self).__init__(url + '/<filename:EOF>') self.path = Path(path)