#30327: Failing collectstatic with ManifestFilesMixin -------------------------------------+------------------------------------- Reporter: Grustamli | Owner: nobody Type: Bug | Status: new Component: | Version: 2.2 contrib.staticfiles | Severity: Release | Keywords: staticfiles blocker | versioning Triage Stage: | Has patch: 0 Unreviewed | Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | -------------------------------------+------------------------------------- Collectstatic throws `KeyError: 'ContentLength'` when used with ManifestFileMixin. Below is the custom storage class I've written to upload the files to Google Cloud Storage.
{{{ class CustomStorage(ManifestFilesMixin, S3Boto3Storage): pass }}} in the settings.py {{{ STATICFILES_STORAGE = 'myapp.storage.CustomStorage' }}} And here is the stacktrace: {{{ UserWarning: The default behavior of S3Boto3Storage is insecure and will change in django-storages 2.0. By default files and new buckets are saved with an ACL of 'public-read' (globally publicly readable). Version 2.0 will default to using the bucket's ACL. To opt into the new behavior set AWS_DEFAULT_ACL = None, otherwise to silence this warning explicitly set AWS_DEFAULT_ACL. "The default behavior of S3Boto3Storage is insecure and will change " Traceback (most recent call last): File "./manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/core/management/base.py", line 316, in run_from_argv self.execute(*args, **cmd_options) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/core/management/base.py", line 353, in execute output = self.handle(*args, **options) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 188, in handle collected = self.collect() File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 128, in collect for original_path, processed_path, processed in processor: File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 402, in post_process yield from super().post_process(*args, **kwargs) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 236, in post_process for name, hashed_name, processed, _ in self._post_process(paths, adjustable_paths, hashed_files): File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 293, in _post_process content = pattern.sub(converter, content) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 194, in converter force=True, hashed_files=hashed_files, File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 131, in _url hashed_name = hashed_name_func(*args) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 342, in _stored_name cache_name = self.clean_name(self.hashed_name(name)) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 99, in hashed_name file_hash = self.file_hash(clean_name, content) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/contrib/staticfiles/storage.py", line 79, in file_hash for chunk in content.chunks(): File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/core/files/base.py", line 55, in chunks self.seek(0) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/django/core/files/utils.py", line 20, in <lambda> seek = property(lambda self: self.file.seek) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/storages/backends/s3boto3.py", line 97, in _get_file self.obj.download_fileobj(self._file) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/boto3/s3/inject.py", line 760, in object_download_fileobj ExtraArgs=ExtraArgs, Callback=Callback, Config=Config) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/boto3/s3/inject.py", line 678, in download_fileobj return future.result() File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/s3transfer/futures.py", line 106, in result return self._coordinator.result() File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/s3transfer/futures.py", line 265, in result raise self._exception File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/s3transfer/tasks.py", line 255, in _main self._submit(transfer_future=transfer_future, **kwargs) File "/home/ufaz/webapps/ufaz_website/.venv/lib/python3.6/site- packages/s3transfer/download.py", line 348, in _submit response['ContentLength']) KeyError: 'ContentLength' }}} As a reminder. I am using Google Cloud Storage since it is also S3 compatible -- Ticket URL: <https://code.djangoproject.com/ticket/30327> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/052.336a1b70d29b9f465967def044c47e95%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.