add view for external tile servers do load cache package
This commit is contained in:
parent
83de101969
commit
1fdcca4ae1
3 changed files with 34 additions and 3 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,6 +4,7 @@ static.dist
|
|||
c3nav.cfg
|
||||
/src/data
|
||||
loadproduction.sh
|
||||
runtileserver.sh
|
||||
|
||||
.idea
|
||||
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
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 = [
|
||||
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'^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'),
|
||||
]
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
import base64
|
||||
import hashlib
|
||||
import os
|
||||
from itertools import chain
|
||||
from wsgiref.util import FileWrapper
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.core.exceptions import PermissionDenied
|
||||
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.views.decorators.http import etag
|
||||
from shapely.geometry import box
|
||||
|
@ -122,7 +124,7 @@ def tile_access(request):
|
|||
return response
|
||||
|
||||
|
||||
@etag(lambda *args, **kwargs: MapUpdate.current_cache_key())
|
||||
@etag(lambda *args, **kwargs: MapUpdate.current_processed_cache_key())
|
||||
@no_language()
|
||||
def history(request, level, mode, format):
|
||||
if not request.user.is_superuser:
|
||||
|
@ -143,3 +145,30 @@ def history(request, level, mode, format):
|
|||
raise ValueError
|
||||
response['Cache-Control'] = 'no-cache'
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue