# HG changeset patch # User Tero Marttila # Date 1412369785 -10800 # Node ID 1dc09e81a4e2bc0d3f5395a4af0d62c96a6a6770 # Parent e1e0c8099c8b355354d2a99aded8b158baa2bc52 pngtile.tile: handle dir/image requests by redirecting to image_server diff -r e1e0c8099c8b -r 1dc09e81a4e2 bin/image-server --- a/bin/image-server Fri Oct 03 23:56:02 2014 +0300 +++ b/bin/image-server Fri Oct 03 23:56:25 2014 +0300 @@ -22,7 +22,6 @@ parser.add_argument('--tile-server', metavar='URL', required=True, help="http://.../ URL to tileserver root") - parser.add_argument('--static', metavar='PATH', default='./static', help="Path to /static") parser.add_argument('image_root', metavar='PATH', diff -r e1e0c8099c8b -r 1dc09e81a4e2 bin/tile-server --- a/bin/tile-server Fri Oct 03 23:56:02 2014 +0300 +++ b/bin/tile-server Fri Oct 03 23:56:25 2014 +0300 @@ -20,13 +20,17 @@ parser.add_argument('--debugger', action='store_true', help="Debugger") + parser.add_argument('--image-server', metavar='URL', required=True, + help="http://.../ URL to imageserver root") parser.add_argument('image_root', metavar='PATH', help="Path to images") args = parser.parse_args() application = pngtile.tile.TileApplication( - image_root = args.image_root, + image_root = args.image_root, + + image_server = args.image_server, ) werkzeug.serving.run_simple(args.listen, args.port, application, diff -r e1e0c8099c8b -r 1dc09e81a4e2 pngtile/tile.py --- a/pngtile/tile.py Fri Oct 03 23:56:02 2014 +0300 +++ b/pngtile/tile.py Fri Oct 03 23:56:25 2014 +0300 @@ -2,8 +2,9 @@ Raw tile handling. """ -from pngtile.application import BaseApplication +from pngtile.application import BaseApplication, url from werkzeug import Request, Response, exceptions +from werkzeug.utils import redirect import pypngtile @@ -42,8 +43,14 @@ return scale(val, zoom) - dim / 2 class TileApplication (BaseApplication): - def __init__ (self, **opts): + def __init__ (self, image_server, **opts): + """ + image_server: http://.../ url to image-server frontend + """ + BaseApplication.__init__(self, **opts) + + self.image_server = image_server def render_region (self, request, image): """ @@ -95,23 +102,72 @@ except pypngtile.Error as error: raise exceptions.BadRequest(str(error)) - def handle (self, request): + def handle_dir (self, request, name, path): """ - Handle request for an image + Redirect to the image frontend for a non-tile request. """ - + + if not name.endswith('/'): + # avoid an additional redirect + name += '/' + + return redirect(url(self.image_server, name)) + + def handle_image (self, request, name, path): + """ + Redirect to the image frontend for a non-tile request. + """ + + return redirect(url(self.image_server, name)) + + def handle_region (self, request): + """ + Return image/png for given region. + """ + try: image, name = self.get_image(request.path) except pypngtile.Error as error: raise exceptions.BadRequest(str(error)) + + png = self.render_region(request, image) + + return Response(png, content_type='image/png') - if 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args: - png = self.render_region(request, image) + def handle_tile (self, request): + """ + Return image/png for given tile. + """ + + try: + image, name = self.get_image(request.path) + except pypngtile.Error as error: + raise exceptions.BadRequest(str(error)) + + png = self.render_tile(request, image) + + return Response(png, content_type='image/png') + + def handle (self, request): + """ + Handle request for an image + """ + + name, path, type = self.lookup_path(request.path) + + # determine handler + if not type: + return self.handle_dir(request, name, path) + + elif not request.args: + return self.handle_image(request, name, path) + + elif 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args: + return self.handle_region(request) elif 'x' in request.args and 'y' in request.args: - png = self.render_tile(request, image) + return self.handle_tile(request) else: raise exceptions.BadRequest("Unknown args") - return Response(png, content_type='image/png')