Ответ @John и Kogan великолепен, но не дает полного кода, необходимого для этой работы: как упоминал @Danra, вам также необходимо сохранить staticfiles.json
в исходной папке, чтобы сделать эту работу. Вот код, который я создал на основе приведенного выше ответа:
import json
import os
from django.conf import settings
from django.core.files.base import ContentFile
from django.core.files.storage import FileSystemStorage
from whitenoise.storage import CompressedManifestStaticFilesStorage
# or if you don't use WhiteNoiseMiddlware:
# from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
class LocalManifestStaticFilesStorage(CompressedManifestStaticFilesStorage):
"""
Saves and looks up staticfiles.json in Project directory
"""
manifest_location = os.path.abspath(settings.BASE_DIR) # or settings.PROJECT_ROOT depending on how you've set it up in your settings file.
manifest_storage = FileSystemStorage(location=manifest_location)
def read_manifest(self):
try:
with self.manifest_storage.open(self.manifest_name) as manifest:
return manifest.read().decode('utf-8')
except IOError:
return None
def save_manifest(self):
payload = {'paths': self.hashed_files, 'version': self.manifest_version}
if self.manifest_storage.exists(self.manifest_name):
self.manifest_storage.delete(self.manifest_name)
contents = json.dumps(payload).encode('utf-8')
self.manifest_storage._save(self.manifest_name, ContentFile(contents))
Теперь вы можете использовать LocalManifestStaticFilesStorage
для вашего STATICFILES_STORAGE
. При запуске manage.py collectstatic
ваш манифест будет сохранен в вашей корневой папке проекта, и Django будет искать его там при обслуживании контента.
Если у вас есть развертывание с несколькими виртуальными машинами, обязательно запустите collectstatic
только один раз и скопируйте файл staticfiles.json
на все машины в вашем развертывании как часть вашего развертывания кода. Хорошая вещь в этом заключается в том, что даже если на некоторых машинах еще не установлено последнее обновление, они все равно будут обслуживать правильный контент (соответствующий текущей версии кода), так что вы можете выполнить постепенное развертывание там, где есть смешанное состояние.