assets: use nginx X-Accel-Redirect to serve asset files (#71258)

This commit is contained in:
Frédéric Péters 2022-11-13 09:42:14 +01:00
parent 8d01db8f41
commit 50bd817862
4 changed files with 28 additions and 3 deletions

View File

@ -390,10 +390,17 @@ def serve_asset(request, key):
# no thumbnail whithout geometry_string or for a svg file
if not geometry_string or asset.asset.name.endswith('svg'):
return redirect(asset.asset.url)
url = asset.asset.url
else:
# get or create thumbnail
url = get_thumbnail(asset.asset, geometry_string, **thumb_options).url
# get or create thumbnail and return url
return redirect(get_thumbnail(asset.asset, geometry_string, **thumb_options).url)
if settings.COMBO_X_ACCEL_ASSETS and url.startswith(settings.MEDIA_URL):
response = HttpResponse(content_type='') # let nginx set it
response['X-Accel-Redirect'] = url
return response
return redirect(url)
class AssetsExportSize(TemplateView):

View File

@ -346,6 +346,9 @@ COMBO_CELL_ASSET_SLOTS = {
},
}
# serve assets using nginx X-Accel
COMBO_X_ACCEL_ASSETS = False
COMBO_CELL_TEMPLATES = {}
COMBO_MAP_LAYER_ASSET_SLOTS = {}

View File

@ -12,6 +12,11 @@ exec(open('/usr/lib/hobo/debian_config_common.py').read())
# add custom hobo agent module
INSTALLED_APPS = ('hobo.agent.combo',) + INSTALLED_APPS
#
# serve assets using nginx X-Accel
#
COMBO_X_ACCEL_ASSETS = True
#
# local settings
#

View File

@ -6,6 +6,7 @@ from io import BytesIO
import pytest
from django.core.files import File
from django.core.files.storage import default_storage
from django.test import override_settings
from django.urls import reverse
from combo.apps.assets.models import Asset
@ -157,3 +158,12 @@ def test_import_export_assets(some_assets, tmpdir):
def test_assets_export_size_view(app, some_assets):
resp = app.get(reverse('combo-manager-assets-export-size'))
assert resp.text.split() == ['(9', 'bytes)']
def test_assets_nginx_x_accel(app, some_assets):
resp = app.get('/assets/banner')
assert resp.location == '/media/assets/test.png'
with override_settings(COMBO_X_ACCEL_ASSETS=True):
resp = app.get('/assets/banner')
assert resp.headers['Content-Type'] == ''
assert resp.headers['X-Accel-Redirect'] == '/media/assets/test.png'