cache tiles on disk
This commit is contained in:
parent
decb01c9c7
commit
84b5c26f3d
2 changed files with 41 additions and 11 deletions
|
@ -1,3 +1,6 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.http import Http404, HttpResponse, HttpResponseNotModified
|
from django.http import Http404, HttpResponse, HttpResponseNotModified
|
||||||
from shapely.geometry import box
|
from shapely.geometry import box
|
||||||
|
|
||||||
|
@ -32,21 +35,44 @@ def tile(request, level, zoom, x, y, format):
|
||||||
if if_none_match == etag:
|
if if_none_match == etag:
|
||||||
return HttpResponseNotModified()
|
return HttpResponseNotModified()
|
||||||
|
|
||||||
|
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))
|
||||||
|
|
||||||
|
try:
|
||||||
|
f = open(filename, 'rb')
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
content_type = 'image/svg+xml' if format == 'svg' else 'image/png'
|
||||||
|
|
||||||
|
if not settings.CACHE_TILES or f is None:
|
||||||
try:
|
try:
|
||||||
renderer.check_level()
|
renderer.check_level()
|
||||||
except Level.DoesNotExist:
|
except Level.DoesNotExist:
|
||||||
raise Http404
|
raise Http404
|
||||||
|
|
||||||
svg = renderer.render()
|
svg = renderer.render()
|
||||||
|
|
||||||
if format == 'svg':
|
if format == 'svg':
|
||||||
response = HttpResponse(svg.get_xml(), 'image/svg+xml')
|
data = svg.get_xml()
|
||||||
|
filemode = 'w'
|
||||||
elif format == 'png':
|
elif format == 'png':
|
||||||
response = HttpResponse(content_type='image/png')
|
data = svg.get_png()
|
||||||
svg.get_png(f=response)
|
filemode = 'wb'
|
||||||
else:
|
else:
|
||||||
raise ValueError
|
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:
|
||||||
|
data = f.read()
|
||||||
|
|
||||||
|
response = HttpResponse(data, content_type)
|
||||||
response['ETag'] = etag
|
response['ETag'] = etag
|
||||||
response['Cache-Control'] = 'no-cache'
|
response['Cache-Control'] = 'no-cache'
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ MEDIA_ROOT = os.path.join(DATA_DIR, 'media')
|
||||||
SOURCES_ROOT = os.path.join(DATA_DIR, 'sources')
|
SOURCES_ROOT = os.path.join(DATA_DIR, 'sources')
|
||||||
MAP_ROOT = os.path.join(DATA_DIR, 'map')
|
MAP_ROOT = os.path.join(DATA_DIR, 'map')
|
||||||
RENDER_ROOT = os.path.join(DATA_DIR, 'render')
|
RENDER_ROOT = os.path.join(DATA_DIR, 'render')
|
||||||
|
TILES_ROOT = os.path.join(DATA_DIR, 'tiles')
|
||||||
|
|
||||||
if not os.path.exists(DATA_DIR):
|
if not os.path.exists(DATA_DIR):
|
||||||
os.mkdir(DATA_DIR)
|
os.mkdir(DATA_DIR)
|
||||||
|
@ -34,6 +35,8 @@ if not os.path.exists(MAP_ROOT):
|
||||||
os.mkdir(MAP_ROOT)
|
os.mkdir(MAP_ROOT)
|
||||||
if not os.path.exists(RENDER_ROOT):
|
if not os.path.exists(RENDER_ROOT):
|
||||||
os.mkdir(RENDER_ROOT)
|
os.mkdir(RENDER_ROOT)
|
||||||
|
if not os.path.exists(TILES_ROOT):
|
||||||
|
os.mkdir(TILES_ROOT)
|
||||||
|
|
||||||
if config.has_option('django', 'secret'):
|
if config.has_option('django', 'secret'):
|
||||||
SECRET_KEY = config.get('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)
|
DEBUG = config.getboolean('django', 'debug', fallback=debug_fallback)
|
||||||
RENDER_SCALE = float(config.get('c3nav', 'render_scale', fallback=20.0))
|
RENDER_SCALE = float(config.get('c3nav', 'render_scale', fallback=20.0))
|
||||||
SVG_RENDERER = config.get('c3nav', 'svg_renderer', fallback='rsvg-convert')
|
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')
|
db_backend = config.get('database', 'backend', fallback='sqlite3')
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue