add view for external tile servers do load cache package

This commit is contained in:
Laura Klünder 2017-11-20 22:48:05 +01:00
parent 83de101969
commit 1fdcca4ae1
3 changed files with 34 additions and 3 deletions

1
.gitignore vendored
View file

@ -4,6 +4,7 @@ static.dist
c3nav.cfg c3nav.cfg
/src/data /src/data
loadproduction.sh loadproduction.sh
runtileserver.sh
.idea .idea

View file

@ -1,9 +1,10 @@
from django.conf.urls import url from django.conf.urls import url
from c3nav.mapdata.views import history, tile, tile_access from c3nav.mapdata.views import cache_package, history, tile, tile_access
urlpatterns = [ urlpatterns = [
url(r'^(?P<level>\d+)/(?P<zoom>\d+)/(?P<x>-?\d+)/(?P<y>-?\d+).png$', tile, name='mapdata.tile'), url(r'^(?P<level>\d+)/(?P<zoom>\d+)/(?P<x>-?\d+)/(?P<y>-?\d+).png$', tile, name='mapdata.tile'),
url(r'^history/(?P<level>\d+)/(?P<mode>base|composite).(?P<format>png|data)$', history, name='mapdata.history'), url(r'^history/(?P<level>\d+)/(?P<mode>base|composite).(?P<format>png|data)$', history, name='mapdata.history'),
url(r'^cache/package(?P<filetype>\.tar|\.tar\.gz|\.tar\.xz)$', cache_package, name='mapdata.cache_package'),
url(r'^tile_access$', tile_access, name='mapdata.tile_access'), url(r'^tile_access$', tile_access, name='mapdata.tile_access'),
] ]

View file

@ -1,12 +1,14 @@
import base64
import hashlib import hashlib
import os import os
from itertools import chain from itertools import chain
from wsgiref.util import FileWrapper
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.signing import b64_encode from django.core.signing import b64_encode
from django.http import Http404, HttpResponse, HttpResponseNotModified from django.http import Http404, HttpResponse, HttpResponseNotModified, StreamingHttpResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.decorators.http import etag from django.views.decorators.http import etag
from shapely.geometry import box from shapely.geometry import box
@ -122,7 +124,7 @@ def tile_access(request):
return response return response
@etag(lambda *args, **kwargs: MapUpdate.current_cache_key()) @etag(lambda *args, **kwargs: MapUpdate.current_processed_cache_key())
@no_language() @no_language()
def history(request, level, mode, format): def history(request, level, mode, format):
if not request.user.is_superuser: if not request.user.is_superuser:
@ -143,3 +145,30 @@ def history(request, level, mode, format):
raise ValueError raise ValueError
response['Cache-Control'] = 'no-cache' response['Cache-Control'] = 'no-cache'
return response return response
encoded_tile_secret = base64.b64encode(settings.SECRET_TILE_KEY.encode()).decode()
@etag(lambda *args, **kwargs: MapUpdate.current_processed_cache_key())
@no_language()
def cache_package(request, filetype):
x_tile_secret = request.META.get('HTTP_X_TILE_SECRET')
if x_tile_secret:
if x_tile_secret != encoded_tile_secret:
raise PermissionDenied
elif not request.user.is_superuser:
raise PermissionDenied
filename = os.path.join(settings.CACHE_ROOT, 'package'+filetype)
f = open(filename, 'rb')
f.seek(0, os.SEEK_END)
size = f.tell()
f.seek(0)
content_type = 'application/' + {'.tar': 'x-tar', '.tar.gz': 'gzip', '.tar.xz': 'x-xz'}[filetype]
response = StreamingHttpResponse(FileWrapper(f), content_type=content_type)
response['Content-Length'] = size
return response