cache tiles on disk

This commit is contained in:
Laura Klünder 2017-10-20 16:47:53 +02:00
parent decb01c9c7
commit 84b5c26f3d
2 changed files with 41 additions and 11 deletions

View file

@ -1,3 +1,6 @@
import os
from django.conf import settings
from django.http import Http404, HttpResponse, HttpResponseNotModified
from shapely.geometry import box
@ -32,21 +35,44 @@ def tile(request, level, zoom, x, y, format):
if if_none_match == etag:
return HttpResponseNotModified()
try:
renderer.check_level()
except Level.DoesNotExist:
raise Http404
f = None
if settings.CACHE_TILES:
dirname = os.path.sep.join((settings.TILES_ROOT, update_cache_key, level, str(zoom), str(x), str(y)))
filename = os.path.sep.join((dirname, access_cache_key+'.'+format))
svg = renderer.render()
try:
f = open(filename, 'rb')
except FileNotFoundError:
pass
if format == 'svg':
response = HttpResponse(svg.get_xml(), 'image/svg+xml')
elif format == 'png':
response = HttpResponse(content_type='image/png')
svg.get_png(f=response)
content_type = 'image/svg+xml' if format == 'svg' else 'image/png'
if not settings.CACHE_TILES or f is None:
try:
renderer.check_level()
except Level.DoesNotExist:
raise Http404
svg = renderer.render()
if format == 'svg':
data = svg.get_xml()
filemode = 'w'
elif format == 'png':
data = svg.get_png()
filemode = 'wb'
else:
raise ValueError
if settings.CACHE_TILES:
# noinspection PyUnboundLocalVariable
os.makedirs(dirname, exist_ok=True)
# noinspection PyUnboundLocalVariable
with open(filename, filemode) as f:
f.write(data)
else:
raise ValueError
data = f.read()
response = HttpResponse(data, content_type)
response['ETag'] = etag
response['Cache-Control'] = 'no-cache'

View file

@ -21,6 +21,7 @@ MEDIA_ROOT = os.path.join(DATA_DIR, 'media')
SOURCES_ROOT = os.path.join(DATA_DIR, 'sources')
MAP_ROOT = os.path.join(DATA_DIR, 'map')
RENDER_ROOT = os.path.join(DATA_DIR, 'render')
TILES_ROOT = os.path.join(DATA_DIR, 'tiles')
if not os.path.exists(DATA_DIR):
os.mkdir(DATA_DIR)
@ -34,6 +35,8 @@ if not os.path.exists(MAP_ROOT):
os.mkdir(MAP_ROOT)
if not os.path.exists(RENDER_ROOT):
os.mkdir(RENDER_ROOT)
if not os.path.exists(TILES_ROOT):
os.mkdir(TILES_ROOT)
if config.has_option('django', 'secret'):
SECRET_KEY = config.get('django', 'secret')
@ -55,6 +58,7 @@ debug_fallback = "runserver" in sys.argv
DEBUG = config.getboolean('django', 'debug', fallback=debug_fallback)
RENDER_SCALE = float(config.get('c3nav', 'render_scale', fallback=20.0))
SVG_RENDERER = config.get('c3nav', 'svg_renderer', fallback='rsvg-convert')
CACHE_TILES = config.get('c3nav', 'cache_tiles', fallback=not DEBUG)
db_backend = config.get('database', 'backend', fallback='sqlite3')
DATABASES = {