diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2026-10-06 09:14:17 +0200 |
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2026-10-06 09:14:17 +0200 |
| commit | 5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231 (patch) | |
| tree | 2fe109af2f90ac4fbf0045d0fbe78cb0bab9fd48 | |
| parent | 3711446782a69058336ebefc923ec2a587c61546 (diff) | |
| download | fietsboek-5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231.tar.gz fietsboek-5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231.tar.bz2 fietsboek-5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231.zip | |
better error handling when requesting tile fails
| -rw-r--r-- | fietsboek/trackmap.py | 12 | ||||
| -rw-r--r-- | fietsboek/views/tileproxy.py | 9 |
2 files changed, 17 insertions, 4 deletions
diff --git a/fietsboek/trackmap.py b/fietsboek/trackmap.py index 7584ece..c2400bb 100644 --- a/fietsboek/trackmap.py +++ b/fietsboek/trackmap.py @@ -1,7 +1,9 @@ """Module to render tracks to static images on OSM tiles.""" import io +import logging import math +import requests from PIL import Image, ImageDraw @@ -9,6 +11,8 @@ from . import geo from .config import TileLayerConfig from .views.tileproxy import TileRequester +LOGGER = logging.getLogger(__name__) + TILE_SIZE = 256 # This is arbitrarily set to provide some image in case a render is requested @@ -107,8 +111,12 @@ class TrackMapRenderer: for i in range(int(math.ceil(self.size[0] / TILE_SIZE)) + 1): for j in range(int(math.ceil(self.size[1] / TILE_SIZE)) + 1): - tile = self._load_tile(zoom, start_x // TILE_SIZE + i, start_y // TILE_SIZE + j) - image.paste(tile, (i * TILE_SIZE + offset_x, j * TILE_SIZE + offset_y)) + try: + tile = self._load_tile(zoom, start_x // TILE_SIZE + i, start_y // TILE_SIZE + j) + except requests.RequestException as exc: + LOGGER.error("Error downloading tiles: %s", exc) + else: + image.paste(tile, (i * TILE_SIZE + offset_x, j * TILE_SIZE + offset_y)) return start_x, start_y diff --git a/fietsboek/views/tileproxy.py b/fietsboek/views/tileproxy.py index f472d6d..8717d6c 100644 --- a/fietsboek/views/tileproxy.py +++ b/fietsboek/views/tileproxy.py @@ -20,7 +20,7 @@ from pyramid.httpexceptions import HTTPBadRequest, HTTPGatewayTimeout from pyramid.request import Request from pyramid.response import Response from pyramid.view import view_config -from requests.exceptions import ReadTimeout +from requests.exceptions import ConnectTimeout, ReadTimeout, RequestException from zope.interface import Interface, implementer from .. import __VERSION__ @@ -411,8 +411,9 @@ def tile_proxy(request): try: # We already tried the cache, so bypass it here resp = loader.load_tile(tile_sources[provider], z, x, y, headers=headers, use_cache=False) - except ReadTimeout: + except (ReadTimeout, ConnectTimeout) as exc: LOGGER.debug("Proxy timeout when accessing z:%s/x:%s/y:%s from %s", z, x, y, provider) + LOGGER.error("Error accessing %s: %s", provider, exc) request.redis.incr(timeout_tracker) request.redis.expire(timeout_tracker, PUNISHMENT_TTL) raise HTTPGatewayTimeout(f"No response in time from {provider}") from None @@ -422,6 +423,10 @@ def tile_proxy(request): if exc.response: status_code = exc.response.status_code return Response(f"Failed to get tile from {provider}", status_code=status_code) + except RequestException as exc: + LOGGER.error("Request error for %s: %s", provider, exc) + status_code = 500 + return Response(f"Failed to get tile from {provider}", status_code=status_code) else: request.redis.set(cache_key, resp, ex=TTL) return Response(resp, content_type=content_type) |
