summaryrefslogtreecommitdiff
path: root/django/contrib/staticfiles/storage.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/contrib/staticfiles/storage.py')
-rw-r--r--django/contrib/staticfiles/storage.py19
1 files changed, 13 insertions, 6 deletions
diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py
index eae25ba737..c09f01e446 100644
--- a/django/contrib/staticfiles/storage.py
+++ b/django/contrib/staticfiles/storage.py
@@ -439,7 +439,7 @@ class HashedFilesMixin:
class ManifestFilesMixin(HashedFilesMixin):
- manifest_version = "1.0" # the manifest format standard
+ manifest_version = "1.1" # the manifest format standard
manifest_name = "staticfiles.json"
manifest_strict = True
keep_intermediate_files = False
@@ -449,7 +449,7 @@ class ManifestFilesMixin(HashedFilesMixin):
if manifest_storage is None:
manifest_storage = self
self.manifest_storage = manifest_storage
- self.hashed_files = self.load_manifest()
+ self.hashed_files, self.manifest_hash = self.load_manifest()
def read_manifest(self):
try:
@@ -461,15 +461,15 @@ class ManifestFilesMixin(HashedFilesMixin):
def load_manifest(self):
content = self.read_manifest()
if content is None:
- return {}
+ return {}, ""
try:
stored = json.loads(content)
except json.JSONDecodeError:
pass
else:
version = stored.get("version")
- if version == "1.0":
- return stored.get("paths", {})
+ if version in ("1.0", "1.1"):
+ return stored.get("paths", {}), stored.get("hash", "")
raise ValueError(
"Couldn't load manifest '%s' (version %s)"
% (self.manifest_name, self.manifest_version)
@@ -482,7 +482,14 @@ class ManifestFilesMixin(HashedFilesMixin):
self.save_manifest()
def save_manifest(self):
- payload = {"paths": self.hashed_files, "version": self.manifest_version}
+ self.manifest_hash = self.file_hash(
+ None, ContentFile(json.dumps(sorted(self.hashed_files.items())).encode())
+ )
+ payload = {
+ "paths": self.hashed_files,
+ "version": self.manifest_version,
+ "hash": self.manifest_hash,
+ }
if self.manifest_storage.exists(self.manifest_name):
self.manifest_storage.delete(self.manifest_name)
contents = json.dumps(payload).encode()