Skip to main content

Support for many storage backends in Django

Project description

PyPI Version Build Status


Installing from PyPI is as easy as doing:

pip install django-storages

If you’d prefer to install from source (maybe there is a bugfix in master that hasn’t been released yet) then the magic incantation you are looking for is:

pip install -e 'git+'

Once that is done add storages to your INSTALLED_APPS and set DEFAULT_FILE_STORAGE to the backend of your choice. If, for example, you want to use the boto3 backend you would set:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

There are also a number of settings available to control how each storage backend functions, please consult the documentation for a comprehensive list.


django-storages is a project to provide a variety of storage backends in a single library.

This library is usually compatible with the currently supported versions of Django. Check the trove classifiers in to be sure.


This repo began as a fork of the original library under the package name of django-storages-redux and became the official successor (releasing under django-storages on PyPI) in February of 2016.

Found a Bug? Something Unsupported?

I suspect that a few of the storage engines in backends/ have been unsupported for quite a long time. I personally only really need the S3Storage backend but welcome bug reports (and especially) patches and tests for some of the other backends.

Issues are tracked via GitHub issues at the project issue page.


The original documentation for django-storages is located at Stay tuned for forthcoming documentation updates.


  1. Check for open issues at the project issue page or open a new issue to start a discussion about a feature or bug.

  2. Fork the django-storages repository on GitHub to start making changes.

  3. Add a test case to show that the bug is fixed or the feature is implemented correctly.

  4. Bug me until I can merge your pull request. Also, don’t forget to add yourself to AUTHORS.

django-storages change log

1.6.3 (2017-06-23)

  • Revert default AWS_S3_SIGNATURE_VERSION to be V2 to restore backwards compatability in S3Boto3. It’s recommended that all new projects set this to be 's3v4'. (#344)

1.6.2 (2017-06-22)

  • Fix regression in safe_join() to handle a trailing slash in an intermediate path. (#341)

  • Fix regression in gs.GSBotoStorage got an unespected kwarg. (#342)

1.6.1 (2017-06-22)

  • Drop support for Django 1.9 (e89db45)

  • Fix regression in safe_join() to allow joining a base path with an empty string. (#336)

1.6 (2017-06-21)

  • Breaking: Remove backends deprecated in v1.5.1 (#280)

  • Breaking: DropBoxStorage has been upgrade to support v2 of the API, v1 will be shut off at the end of the month - upgrading is recommended (#273)

  • Breaking: The SFTPStorage backend now checks for the existence of the fallback ~/.ssh/known_hosts before attempting to load it. If you had previously been passing in a path to a non-existent file it will no longer attempt to load the fallback. (issue #118 pr #325)

  • Breaking: The default version value for AWS_S3_SIGNATURE_VERSION is now 's3v4'. No changes should be required (#335)

  • Deprecation: The undocumented gs.GSBotoStorage backend. See the new gcloud.GoogleCloudStorage or apache_libcloud.LibCloudStorage backends instead. (#236)

  • Add a new backend, gcloud.GoogleCloudStorage based on the google-cloud bindings. (#236)

  • Pass in the location constraint when auto creating a bucket in S3Boto3Storage (#257, #258)

  • Add support for reading AWS_SESSION_TOKEN and AWS_SECURITY_TOKEN from the environment to S3Boto3Storage and S3BotoStorage. (#283)

  • Fix Boto3 non-ascii filenames on Python 2.7 (#216, #217)

  • Fix collectstatic timezone handling in and add get_modified_time to S3BotoStorage (#290)

  • Add support for Django 1.11 (#295)

  • Add project keyword support to GCS in LibCloudStorage backend (#269)

  • Files that have a guessable encoding (e.g. gzip or compress) will be uploaded with that Content-Encoding in the s3boto3 backend (issue #263 pr #264)

  • The Dropbox backend now properly translates backslashes in Windows paths into forward slashes (e52a127)

  • The S3 backends now permit colons in the keys (issue #248 pr #322)

1.5.2 (2017-01-13)

  • Actually use SFTP_STORAGE_HOST in SFTPStorage backend (#204)

  • Fix S3Boto3Storage to avoid race conditions in a multi-threaded WSGI environment (#238)

  • Fix trying to localize a naive datetime when settings.USE_TZ is False in S3Boto3Storage.modified_time. (#235, #234)

  • Fix automatic bucket creation in S3Boto3Storage when AWS_AUTO_CREATE_BUCKET is True (#196)

  • Improve the documentation for the S3 backends

1.5.1 (2016-09-13)

  • Breaking: Drop support for Django 1.7 (#185)

  • Deprecation: hashpath, image, overwrite, mogile, symlinkorcopy, database, mogile, couchdb. See (issue #202) to discuss maintenance going forward

  • Use a fixed mtime argument for GzipFile in S3BotoStorage and S3Boto3Storage to ensure a stable output for gzipped files

  • Use .putfileobj instead of .put in S3Boto3Storage to use the transfer manager, allowing files greater than 5GB to be put on S3 (#194 , #201)

  • Update S3Boto3Storage for Django 1.10 (#181) (get_modified_time and get_accessed_time)

  • Fix bad kwarg name in S3Boto3Storage when AWS_PRELOAD_METADATA is True (#189, #190)

1.5.0 (2016-08-02)

  • Add new backend S3Boto3Storage (#179)

  • Add a strict option to utils.setting (#176)

  • Tests, documentation, fixing .close for SFTPStorage (#177)

  • Tests, documentation, add .readlines for FTPStorage (#175)

  • Tests and documentation for DropBoxStorage (#174)

  • Fix to not ship .pyc files. (#145)

  • Enable CI testing of Python 3.5 and fix test failure from api change (#171)

1.4.1 (2016-04-07)

  • Files that have a guessable encoding (e.g. gzip or compress) will be uploaded with that Content-Encoding in the s3boto backend. Compressable types such as application/javascript will still be gzipped. PR #122

  • Fix DropBoxStorage.exists check and add DropBoxStorage.url (#127)

  • Add GS_HOST setting (with a default of GSConnection.DefaultHost) to fix GSBotoStorage. Issue #124. Fixed in #125.

1.4 (2016-02-07)

  • This package is now released on PyPI as django-storages. Please update your requirements files to django-storages==1.4.

1.3.2 (2016-01-26)

  • Fix memory leak from not closing underlying temp file in s3boto backend (#106)

  • Allow easily specifying a custom expiry time when generating a url for S3BotoStorage (#96)

  • Check for bucket existence when the empty path (‘’) is passed to storage.exists in S3BotoStorage - this prevents a crash when running collectstatic -c on Django 1.9.1 (#112) fixed in #116

1.3.1 (2016-01-12)

  • A few Azure Storage fixes [pass the content-type to Azure, handle chunked content, fix url] (#45)

  • Add support for a Dropbox (dropbox) storage backend

  • Various fixes to the apache_libcloud backend [return the number of bytes asked for by .read, make .name non-private, don’t initialize to an empty BytesIO object] (#55)

  • Fix multi-part uploads in s3boto backend not respecting AWS_S3_ENCRYPTION (#94)

  • Automatically gzip svg files (#100)

1.3 (2015-08-14)

  • Breaking: Drop Support for Django 1.5 and Python 2.6

  • Breaking: Remove previously deprecated mongodb backend

  • Breaking: Remove previously deprecated parse_ts_extended from s3boto storage

  • Add support for Django 1.8+ (#36)

  • Add AWS_S3_PROXY_HOST and AWS_S3_PROXY_PORT settings for s3boto backend (#41)

  • Fix Python3K compat issue in apache_libcloud (#52)

  • Fix Google Storage backend not respecting GS_IS_GZIPPED setting (#51, #60)

  • Rename FTP _name attribute to name which is what the Django File api is expecting (#70)

  • Put StorageMixin first in inheritance to maintain backwards compat with older versions of Django (#63)

1.2.3 (2015-03-14)

  • Variety of FTP backend fixes (fix exists, add modified_time, remove call to non-existent function) (#26)

  • Apparently the year changed to 2015

1.2.2 (2015-01-28)

  • Remove always show all warnings filter (#21)

  • Release package as a wheel

  • Avoid resource warning during install (#20)

  • Made S3BotoStorage deconstructible (previously only S3BotoStorageFile was deconstructible) (#19)

1.2.1 (2014-12-31)

  • Deprecation: Issue warning about parse_ts_extended

  • Deprecation: mongodb backend - django-mongodb-engine now ships its own storage backend

  • Fix storage.modified_time crashing on new files when AWS_PRELOAD_METADATA=True (#11, #12, #14)

1.2 (2014-12-14)

  • Breaking: Remove legacy S3 storage (#1)

  • Breaking: Remove mosso files backend (#2)

  • Add text/javascript mimetype to S3BotoStorage gzip allowed defaults

  • Add support for Django 1.7 migrations in S3BotoStorage and ApacheLibCloudStorage (#5, #8)

  • Python3K (3.3+) now available for S3Boto backend (#4)

NOTE: Version 1.1.9 is the first release of django-storages after the fork. It represents the current (2014-12-08) state of the original django-storages in master with no additional changes. This is the first release of the code base since March 2013.

1.1.9 (2014-12-08)

  • Fix syntax for Python3 with pull-request #91

  • Support pushing content type from File object to GridFS with pull-request #90

  • Support passing a region to the libcloud driver with pull-request #86

  • Handle trailing slash paths fixes #188 fixed by pull-request #85

  • Use a SpooledTemporaryFile to conserve memory in S3BotoFile pull-request #69

  • Guess content-type for S3BotoStorageFile the same way that _save() in S3BotoStorage does

  • Pass headers and response_headers through from url to generate_url in S3BotoStorage pull-request #65

  • Added AWS_S3_HOST, AWS_S3_PORT and AWS_S3_USE_SSL settings to specify host, port and is_secure in pull-request #66

Everything Below Here Was Previously Released on PyPi under django-storages

1.1.8 (2013-03-31)

  • Fixes #156 regarding date parsing, ValueError when running collectstatic

  • Proper handling of boto dev version parsing

  • Made SFTP URLs accessible, now uses settings.MEDIA_URL instead of sftp://

1.1.7 (2013-03-20)

  • Listing of huge buckets on S3 is now prevented by using the prefix argument to boto’s list() method

  • Initial support for Windows Azure Storage

  • Switched to useing boto’s parse_ts date parser getting last modified info when using S3boto backend

  • Fixed key handling in S3boto and Google Storage backends

  • Account for lack of multipart upload in Google Storage backend

  • Fixed seek() issue when using AWS_IS_GZIPPED by darkness51 with pull-request #50

  • Improvements to S3BotoStorage and GSBotoStorage

1.1.6 (2013-01-06)

  • Merged many changes from Jannis Leidel (mostly regarding gzipping)

  • Fixed tests by Ian Lewis

  • Added support for Google Cloud Storage backend by Jannis Leidel

  • Updated license file by Dan Loewenherz, fixes #133 with pull-request #44

  • Set Content-Type header for use in upload_part_from_file by Gerardo Curiel

  • Pass the rewind parameter to Boto’s set_contents_from_file method by Jannis Leidel with pull-request #45

  • Fix for FTPStorageFile close() method by Mathieu Comandon with pull-request #43

  • Minor refactoring by Oktay Sancak with pull-request #48

  • Ungzip on download based on Content-Encoding by Gavin Wahl with pull-request #46

  • Add support for S3 server-side encryption by Tobias McNulty with pull-request #17

  • Add an optional setting to the boto storage to produce protocol-relative URLs, fixes #105

1.1.5 (2012-07-18)

  • Merged pull request #36 from freakboy3742 Keith-Magee, improvements to Apache Libcloud backend and docs

  • Merged pull request #35 from atodorov, allows more granular S3 access settings

  • Add support for SSL in Rackspace Cloudfiles backend

  • Fixed the listdir() method in s3boto backend, fixes #57

  • Added base url tests for safe_join in s3boto backend

  • Merged pull request #20 from alanjds, fixed SuspiciousOperation warning if AWS_LOCATION ends with ‘/’

  • Added FILE_BUFFER_SIZE setting to s3boto backend

  • Merged pull request #30 from pendletongp, resolves #108, #109 and #110

  • Updated the modified_time() method so that it doesn’t require dateutil. fixes #111

  • Merged pull request #16 from chamal, adds Apache Libcloud backend

  • When preloading the S3 metadata make sure we reset the files key during saving to prevent stale metadata

  • Merged pull request #24 from tobias.mcnulty, fixes bug where s3boto backend returns modified_time in wrong time zone

  • Fixed HashPathStorage.location to no longer use settings.MEDIA_ROOT

  • Remove download_url from setup file so PyPI dist is used

1.1.4 (2012-01-06)

  • Added PendingDeprecationWarning for mosso backend

  • Merged pull request #13 from marcoala, adds SFTP_KNOWN_HOST_FILE setting to SFTP storage backend

  • Merged pull request #12 from ryankask, fixes HashPathStorage tests that delete remote media

  • Merged pull request #10 from key, adds support for django-mongodb-engine 0.4.0 or later, fixes GridFS file deletion bug

  • Fixed S3BotoStorage performance problem calling modified_time()

  • Added deprecation warning for s3 backend, refs #40

  • Fixed CLOUDFILES_CONNECTION_KWARGS import error, fixes #78

  • Switched to sphinx documentation, set official docs up on

  • HashPathStorage uses self.exists now, fixes #83

1.1.3 (2011-08-15)

  • Created this lovely change log

  • Fixed #89: broken StringIO import in CloudFiles backend

  • Merged pull request #5: HashPathStorage path bug

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-storages-1.6.3.tar.gz (60.0 kB view hashes)

Uploaded Source

Built Distribution

django_storages-1.6.3-py2.py3-none-any.whl (46.4 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page