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 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'
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue