From efdac7444dcec28f19fc4b2473d0c251cac66581 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 4 Sep 2026 15:44:19 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9E=95(backend)=20add=20servestatic=20depend?= =?UTF-8?q?ency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We removed previously whitenoise because it was not working with asgi application. By removing it we also removed the way to serve the static files in the application. There is an existing fork of whitenoise, servestatic, that manage async application and we can use it to serve static files. --- CHANGELOG.md | 1 + src/backend/impress/settings.py | 18 ++++++++++++++++-- src/backend/pyproject.toml | 1 + src/backend/uv.lock | 14 ++++++++++++++ src/helm/env.d/dev/values.impress.yaml.gotmpl | 2 +- .../env.d/feature/values.impress.yaml.gotmpl | 2 +- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 438a4b12f..679d887c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to - 🐛(frontend) hide Leave in the doc menu when not logged in #2626 - 🐛(backend) allow to configure settings DATA_UPLOAD_MAX_MEMORY_SIZE +- ➕(backend) add servestatic dependency ## [v5.6.0] - 2026-09-03 diff --git a/src/backend/impress/settings.py b/src/backend/impress/settings.py index 3b4dbf9dd..ccec5e563 100755 --- a/src/backend/impress/settings.py +++ b/src/backend/impress/settings.py @@ -160,7 +160,7 @@ class Base(Configuration): }, "staticfiles": { "BACKEND": values.Value( - "django.contrib.staticfiles.storage.StaticFilesStorage", + "servestatic.storage.CompressedManifestStaticFilesStorage", environ_name="STORAGES_STATICFILES_BACKEND", ), }, @@ -356,6 +356,7 @@ class Base(Configuration): MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", + "servestatic.middleware.ServeStaticMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.locale.LocaleMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", @@ -381,6 +382,7 @@ class Base(Configuration): # impress "core", "demo", + "servestatic", "drf_spectacular", # Third party apps "corsheaders", @@ -1302,7 +1304,7 @@ class Build(Base): }, "staticfiles": { "BACKEND": values.Value( - "django.contrib.staticfiles.storage.StaticFilesStorage", + "servestatic.storage.CompressedManifestStaticFilesStorage", environ_name="STORAGES_STATICFILES_BACKEND", ), }, @@ -1374,6 +1376,18 @@ class Test(Base): CELERY_TASK_ALWAYS_EAGER = values.BooleanValue(True) + STORAGES = { + "default": { + "BACKEND": "storages.backends.s3.S3Storage", + }, + "staticfiles": { + "BACKEND": values.Value( + "servestatic.storage.CompressedStaticFilesStorage", + environ_name="STORAGES_STATICFILES_BACKEND", + ), + }, + } + def __init__(self): # pylint: disable=invalid-name self.INSTALLED_APPS += ["drf_spectacular_sidecar"] diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index eee0d8d0c..ea2e8a736 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -67,6 +67,7 @@ dependencies = [ "redis<6.0.0", "requests==2.34.2", "sentry-sdk==2.66.1", + "servestatic==4.3.3", "uvicorn==0.51.0", ] diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 019eea24a..139106b7e 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -994,6 +994,7 @@ dependencies = [ { name = "redis" }, { name = "requests" }, { name = "sentry-sdk" }, + { name = "servestatic" }, { name = "uvicorn" }, ] @@ -1081,6 +1082,7 @@ requires-dist = [ { name = "responses", marker = "extra == 'dev'", specifier = "==0.26.2" }, { name = "ruff", marker = "extra == 'dev'", specifier = "==0.16.0" }, { name = "sentry-sdk", specifier = "==2.66.1" }, + { name = "servestatic", specifier = "==4.3.3" }, { name = "types-requests", marker = "extra == 'dev'", specifier = "==2.33.0.20260712" }, { name = "uvicorn", specifier = "==0.51.0" }, ] @@ -2375,6 +2377,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/d3/726bd88f0eece09ddf431bea4c9191c18e7a8d070b854eb0014d447712ee/sentry_sdk-2.66.1-py3-none-any.whl", hash = "sha256:86002793161d9a95ef04bdd8d442e9bfece5d989b755f05d6360215094a7aff6", size = 505555, upload-time = "2026-07-22T12:26:52.71Z" }, ] +[[package]] +name = "servestatic" +version = "4.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/6b/ccfd794c446b61a191848337dc2757219152b142879dd50ff93b0e7290a7/servestatic-4.3.3.tar.gz", hash = "sha256:87628989eed8b6594ceed052bb185593df1fb3ff2db7c0c69b05bb8b2f7393d0", size = 33426, upload-time = "2026-09-02T21:55:49.492Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/fb/222b40a47f1f5736728c00485758ca35ffa8535a16f75e22e1a05205f614/servestatic-4.3.3-py3-none-any.whl", hash = "sha256:d46d374eef87a48b3b55379bf693613420e186c5b823f3e8fcceeda65c0c6e30", size = 40519, upload-time = "2026-09-02T21:55:48.302Z" }, +] + [[package]] name = "six" version = "1.17.0" diff --git a/src/helm/env.d/dev/values.impress.yaml.gotmpl b/src/helm/env.d/dev/values.impress.yaml.gotmpl index 981f4c84a..03715cdca 100644 --- a/src/helm/env.d/dev/values.impress.yaml.gotmpl +++ b/src/helm/env.d/dev/values.impress.yaml.gotmpl @@ -71,7 +71,7 @@ backend: AWS_S3_ACCESS_KEY_ID: dinum AWS_S3_SECRET_ACCESS_KEY: password AWS_STORAGE_BUCKET_NAME: docs-media-storage - STORAGES_STATICFILES_BACKEND: django.contrib.staticfiles.storage.StaticFilesStorage + STORAGES_STATICFILES_BACKEND: servestatic.storage.CompressedManifestStaticFilesStorage DOCSPEC_API_URL: http://impress-docs-docspec:4000/conversion USER_RECONCILIATION_FORM_URL: https://docs.127.0.0.1.nip.io Y_PROVIDER_API_BASE_URL: http://impress-docs-y-provider-converter:443/api/ diff --git a/src/helm/env.d/feature/values.impress.yaml.gotmpl b/src/helm/env.d/feature/values.impress.yaml.gotmpl index e61d74154..51b2bb71d 100644 --- a/src/helm/env.d/feature/values.impress.yaml.gotmpl +++ b/src/helm/env.d/feature/values.impress.yaml.gotmpl @@ -71,7 +71,7 @@ backend: AWS_S3_ACCESS_KEY_ID: dinum AWS_S3_SECRET_ACCESS_KEY: password AWS_STORAGE_BUCKET_NAME: docs-media-storage - STORAGES_STATICFILES_BACKEND: django.contrib.staticfiles.storage.StaticFilesStorage + STORAGES_STATICFILES_BACKEND: servestatic.storage.CompressedManifestStaticFilesStorage DOCSPEC_API_URL: http://impress-docs-docspec:4000/conversion USER_RECONCILIATION_FORM_URL: https://{{ .Values.feature }}-docs.{{ .Values.domain }} Y_PROVIDER_API_BASE_URL: http://impress-docs-y-provider-converter:443/api/