Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased¶
- Nothing (yet)
4.1.0 - 2026-03-07¶
Tip
This release includes some changes to the default behavior of ServeStatic for security hardening. If you are affected by any of these changes, please read the relevant sections in the documentation on allow_unsafe_symlinks.
Added¶
- Added support for
zstdcompression on Python 3.14+. - Added support for the top-level
servestaticmodule to run as a Django app. - Added Django system checks to test for common misconfigurations.
- Added a new
allow_unsafe_symlinksconfiguration option for WSGI/ASGI - Added a new
SERVESTATIC_ALLOW_UNSAFE_SYMLINKSconfiguration option for Django. - Added
jxlimage support.
Changed¶
- Improved event-loop handling for ASGI file iterator.
- Installing
servestaticas a Django app is now the suggested configuration. A warning will appear if it is not detected inINSTALLED_APPSwhenDEBUGisTrue. servestatic.runserver_nostaticis no longer the recommended Django app installation path. This import path will be retained to easeWhiteNoisetoServeStaticmigration, but now the documentation recommends to use the top-levelservestaticmodule instead.- For security purposes,
ServeStaticwill no longer follow unsafe symlinks by default. If your symlinks point to files outside of your static root, it is highly recommended to copy them instead. This behavior can be disabled for trusted deployments usingallow_unsafe_symlinks/SERVESTATIC_ALLOW_UNSAFE_SYMLINKS.
Fixed¶
- Fixed a range-request edge case where the last byte could be requested but would not be served.
Security¶
- Hardened
autorefreshpath matching to prevent potential path traversal or path clobbering. - Hardened static file resolution to block symlink breakout by default.
4.0.0 - 2026-03-05¶
Added¶
- Added
servestaticCLI command for creating manifests, hashing, and compressing for static files.
Changed¶
- Minimum python version is now 3.10.
immutable_file_testnow defaults to a regex matching the file name format generated byservestatic --hash(for exampleapp.db8f2edc0c8a.js).
Deprecated¶
- Calling the compression API via
python -m servestatic.compressis now deprecated. Please use theservestatic --compressCLI instead.
Fixed¶
- Fix race condition where
ServeStaticcould throw an exception when shutting down async file threads.
3.1.0 - 2025-06-10¶
Added¶
- Added support for running
ServeStaticin standalone WSGI/ASGI mode (without an app).
3.0.2 - 2025-06-03¶
Fixed¶
- Fixed a bug where
ServeStaticASGIwas preventing compatibility with thelifespanprotocol. All non-HTTP requests are now properly forwarded to the user's ASGI app.
3.0.1 - 2025-03-02¶
Fixed¶
- Fixed compatibility between the two following Django settings:
SERVESTATIC_KEEP_ONLY_HASHED_FILESandSERVESTATIC_USE_MANIFEST
3.0.0 - 2025-01-10¶
Changed¶
- Drop Django 3.2 and 4.1 support.
- Any errors from threads in the
servestatic.compresscommand are now raised. - Compression code has been refactored to match upstream (WhiteNoise).
Fixed¶
- Add
asgirefto dependencies to fix import error.
2.1.1 - 2024-10-27¶
Fixed¶
- Make sure WSGI
SlicedFileis closed properly to prevent subtle bugs.
2.1.0 - 2024-10-02¶
Added¶
- Support Python 3.13.
Changed¶
- Query strings are now preserved during HTTP redirection.
2.0.1 - 2024-09-13¶
Fixed¶
- Fix crash when running
manage.py collectstaticwhen Django'ssettings.py:STATIC_ROOTis aPathobject.
2.0.0 - 2024-09-12¶
Added¶
- Django
settings.py:SERVESTATIC_USE_MANIFESTwill allow ServeStatic to use the Django manifest rather than scanning the filesystem.- When also using ServeStatic's
CompressedManifestStaticFilesStoragebackend, ServeStatic will no longer need to callos.stat.
- When also using ServeStatic's
Changed¶
- Minimum python version is now 3.9.
- Django
setings.py:SERVESTATIC_USE_FINDERSwill now discover files strictly using the finders API. Previously, ServeStatic would also scansettings.py:STATIC_ROOTfor files not found by the finders API. - Async file reading is now done via threads rather than
aiofilesdue recent performance tests. BaseServeStatichas been renamed toServeStaticBase.AsgiFileServerhas been renamed toFileServerASGI.- Lots of internal refactoring to improve performance, code quality, and maintainability.
1.2.0 - 2024-08-30¶
Added¶
- Verbose Django
404error page whensettings.py:DEBUGisTrue
Fixed¶
- Fix Django compatibility with third-party sync middleware.
- ServeStatic Django middleware now only runs in async mode to avoid clashing with Django's internal usage of
asgiref.AsyncToSync.
- ServeStatic Django middleware now only runs in async mode to avoid clashing with Django's internal usage of
- Respect Django
settings.py:FORCE_SCRIPT_NAMEconfiguration value.
1.1.0 - 2024-08-27¶
Added¶
- Files are now compressed within a thread pool to increase performance.
Fixed¶
- Fix Django
StreamingHttpResponse must consume synchronous iteratorswarning. - Fix Django bug where file paths could fail to be followed on Windows.
1.0.0 - 2024-05-08¶
Changed¶
- Forked from
whitenoiseto add ASGI support.