django-storages (1.13.2)
Installation
pip install --index-url django-storagesAbout this package
Support for many storage backends in Django
.. image:: https://raw.githubusercontent.com/jschneier/django-storages/master/docs/logos/horizontal.png :alt: Django-Storages :width: 100%
.. image:: https://img.shields.io/pypi/v/django-storages.svg :target: https://pypi.org/project/django-storages/ :alt: PyPI Version
.. image:: https://github.com/jschneier/django-storages/actions/workflows/ci.yml/badge.svg :target: https://github.com/jschneier/django-storages/actions/workflows/ci.yml :alt: Build Status
Installation
Installing from PyPI is as easy as doing:
.. code-block:: bash
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:
.. code-block:: bash
pip install -e 'git+https://github.com/jschneier/django-storages.git#egg=django-storages'
Once that is done set DEFAULT_FILE_STORAGE to the backend of your choice.
If, for example, you want to use the boto3 backend you would set:
.. code-block:: python
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
If you are using the FileSystemStorage as your storage management class in your models FileField fields, remove them
and don't specify any storage parameter. That way, the DEFAULT_FILE_STORAGE class will be used by default in your field.
For example, if you have a photo field defined as:
.. code-block:: python
photo = models.FileField(
storage=FileSystemStorage(location=settings.MEDIA_ROOT),
upload_to='photos',
)
Set it to just:
.. code-block:: python
photo = models.FileField(
upload_to='photos',
)
There are also a number of settings available to control how each storage backend functions, please consult the documentation for a comprehensive list.
About
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 setup.py to be sure.
django-storages is backed in part by Tidelift_. Check them out for all of your enterprise open source
software commercial support needs.
Security
To report a security vulnerability, please use the Tidelift security contact_. Tidelift will coordinate the
fix and disclosure. Please do not post a public issue on the tracker.
.. _Tidelift security contact: https://tidelift.com/security
Found a Bug?
Issues are tracked via GitHub issues at the project issue page <https://github.com/jschneier/django-storages/issues>_.
Documentation
Documentation for django-storages is located at https://django-storages.readthedocs.io/.
Contributing
#. Check for open issues <https://github.com/jschneier/django-storages/issues>_ at the project
issue page or open a new issue to start a discussion about a feature or bug.
#. Fork the django-storages repository on GitHub <https://github.com/jschneier/django-storages>_ to start making changes.
#. Add a test case to show that the bug is fixed or the feature is implemented
correctly.
#. Bug me until I can merge your pull request.
Please don't update the library version in CHANGELOG.rst or storages/__init__.py, the maintainer will do that on release.
If you're the first to update the CHANGELOG in this release cycle, just put the version as XXXX-XX-XX.
History
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.
django-storages CHANGELOG
1.13.2 (2022-12-23)
General
- Add support for Python 3.11 (
#1196_) - Add support for saving
pathlib.Pathnames (#1200_)
S3
- Catch 404 errors when calling
delete()(#1201_)
Azure
- Use
AZURE_CUSTOM_DOMAINfor retrieving blob URLs and storage URL for other operations (#1176_)
Google Cloud
- Use
DEFAULT_RETRYfor all upload & delete operations (#1156_) - Fix gzipping of content (
#1203_) - Pass through kwargs to signed URL generator (
#1193_)
SFTP
- Improve write & memory performance when saving files (
#1194_)
.. _#1196: https://github.com/jschneier/django-storages/pull/1196 .. _#1200: https://github.com/jschneier/django-storages/pull/1200 .. _#1201: https://github.com/jschneier/django-storages/pull/1201 .. _#1176: https://github.com/jschneier/django-storages/pull/1176 .. _#1156: https://github.com/jschneier/django-storages/pull/1156 .. _#1203: https://github.com/jschneier/django-storages/pull/1203 .. _#1193: https://github.com/jschneier/django-storages/pull/1193 .. _#1194: https://github.com/jschneier/django-storages/pull/1194
1.13.1 (2022-08-06)
Dropbox
- Strip off the root path when saving files to fix saving with upgraded versions of Django (
#1168_) - Update
DropBoxStorageconstructor parameter order to be backwards compatible (#1167_)
.. _#1167: https://github.com/jschneier/django-storages/pull/1167 .. _#1168: https://github.com/jschneier/django-storages/pull/1168
1.13 (2022-08-05)
General
- Add support for Django 4.0 and 4.1 (
#1093_) - Drop support for Django 2.2, 3.0 and 3.1 (
#1093_) - Drop support for Python 3.5 and 3.6 (
#1093_)
S3
- Breaking: Update and document the undocumented
AWS_S3_URL_PROTOCOLfromhttp:tohttps:and remove the undocumentedAWS_S3_SECURE_URLSsetting. You should only need to update your settings if you had updated either of these previously undocumented settings. The default behavior of constructing anhttps:URL with a custom domain is unchanged (#1164_) - Add
AWS_S3_USE_THREADSto disablethreadingfor compatibility withgevent(#1112_)
Dropbox
- Add support for refresh tokens (
#1159_) - Ignore
ApiErrorexception inurl()(#1158_)
Azure
- Restore support for
AZURE_ENDPOINT_SUFFIX(#1118_) - Replace deprecated
download_to_streamwithreadinto(#1113_) - Add
AZURE_API_VERSIONsetting (#1132_) - Fix
get_modified_time()(#1134_)
Google Cloud
- Add support for gzipping files via
GS_IS_GZIPPEDandGZIP_CONTENT_TYPES(#980_) - Use
GS_BLOB_CHUNK_SIZEwith files that already exist (#1154_)
.. _#980: https://github.com/jschneier/django-storages/pull/980 .. _#1118: https://github.com/jschneier/django-storages/pull/1118 .. _#1113: https://github.com/jschneier/django-storages/pull/1113 .. _#1112: https://github.com/jschneier/django-storages/pull/1112 .. _#1132: https://github.com/jschneier/django-storages/pull/1132 .. _#1134: https://github.com/jschneier/django-storages/pull/1134 .. _#1159: https://github.com/jschneier/django-storages/pull/1159 .. _#1158: https://github.com/jschneier/django-storages/pull/1158 .. _#1164: https://github.com/jschneier/django-storages/pull/1164 .. _#1093: https://github.com/jschneier/django-storages/pull/1093 .. _#1154: https://github.com/jschneier/django-storages/pull/1154
1.12.3 (2021-10-29)
General
- Add support for Python 3.10 (
#1078_)
S3
- Re-raise non-404 errors in
.exists()(#1084,#1085)
Azure
- Fix using
AZURE_CUSTOM_DOMAINwith an account key credential (#1082,#1083)
SFTP
- Catch
FileNotFoundErrorinstead ofOSerrorin.exists()to prevent swallowingsocket.timeoutexceptions (#1064,#1087)
.. _#1078: https://github.com/jschneier/django-storages/pull/1078 .. _#1084: https://github.com/jschneier/django-storages/issues/1084 .. _#1085: https://github.com/jschneier/django-storages/pull/1085 .. _#1082: https://github.com/jschneier/django-storages/issues/1082 .. _#1083: https://github.com/jschneier/django-storages/pull/1083 .. _#1064: https://github.com/jschneier/django-storages/issues/1064 .. _#1087: https://github.com/jschneier/django-storages/pull/1087
1.12.2 (2021-10-16)
Azure
- Add
parameterskwarg toAzureStorage.urlto configure blob properties in the SAS token (#1071_) - Fix regression where
AZURE_CUSTOM_DOMAINwas interpreted as a replacement ofblob.core.windows.netrather than as a full domain (#1073,#1076)
.. _#1071: https://github.com/jschneier/django-storages/pull/1071 .. _#1073: https://github.com/jschneier/django-storages/issues/1073 .. _#1076: https://github.com/jschneier/django-storages/pull/1076
1.12.1 (2021-10-11)
S3
- Change gzip compression to use a streaming implementation (
#1061_) - Fix saving files with
S3ManifestStaticStorage(#1068,#1069)
.. _#1061: https://github.com/jschneier/django-storages/pull/1061 .. _#1068: https://github.com/jschneier/django-storages/issues/1068 .. _#1069: https://github.com/jschneier/django-storages/pull/1069
1.12 (2021-10-06)
General
- Add support for Django 3.2 (
#1046,#1042,#1005_) - Replace Travis CI with GitHub actions (
#1051_)
S3
- Convert signing keys to bytes if necessary (
#1003_) - Avoid a ListParts API call during multipart upload (
#1041_) - Custom domains now use passed URL params (
#1054_) - Allow the use of AWS profiles and clarify the options for passing credentials (
fbe9538_) - Re-allow override of various access key names (
#1026_) - Properly exclude empty folders during
listdir(66f4f8e_) - Support saving file objects that are not
seekable(#860,#1057) - Return
Truefor.exists()if a non-404 error is encountered (#938_)
Azure
- Breaking: This backend has been rewritten to use the newer versions of
azure-storage-blob, which now has a minimum required version of 12.0. The settingsAZURE_EMULATED_MODE,AZURE_ENDPOINT_SUFFIX, andAZURE_CUSTOM_CONNECTION_STRINGare now ignored. (#784,#805) - Add support for user delegation keys (
#1063_)
Google Cloud
- Breaking: The minimum required version of
google-cloud-storageis now 1.27.0 (#994_) - Breaking: Switch URL signing version from v2 to v4 (
#994_) - Deprecated: Support for
GS_CACHE_CONTROLwill be removed in 1.13. Please set thecache_controlparameter ofGS_OBJECT_PARAMETERSinstead. (#970_) - Add
GS_OBJECT_PARAMETERSand overridableGoogleCloudStorage.get_object_parametersto customize blob parameters for all blobs and per-blob respectively. (#970_) - Catch the
NotFoundexception raised when deleting a non-existent blob, this matches Django and other backends (#998,#999) - Fix signing URLs with custom endpoints (
#994_)
Dropbox
- Validate
write_modeparam (#1020_)
.. _fbe9538: fbe9538b85
.. _66f4f8e: 66f4f8ec68
.. _#1003: https://github.com/jschneier/django-storages/pull/1003
.. _#1054: https://github.com/jschneier/django-storages/pull/1054
.. _#1026: https://github.com/jschneier/django-storages/pull/1026
.. _#1041: https://github.com/jschneier/django-storages/pull/1041
.. _#970: https://github.com/jschneier/django-storages/pull/970
.. _#998: https://github.com/jschneier/django-storages/issues/998
.. _#784: https://github.com/jschneier/django-storages/issues/784
.. _#805: https://github.com/jschneier/django-storages/pull/805
.. _#999: https://github.com/jschneier/django-storages/pull/999
.. _#1051: https://github.com/jschneier/django-storages/pull/1051
.. _#1042: https://github.com/jschneier/django-storages/pull/1042
.. _#1046: https://github.com/jschneier/django-storages/issues/1046
.. _#1005: https://github.com/jschneier/django-storages/pull/1005
.. _#1020: https://github.com/jschneier/django-storages/pull/1020
.. _#860: https://github.com/jschneier/django-storages/issues/860
.. _#1057: https://github.com/jschneier/django-storages/pull/1057
.. _#938: https://github.com/jschneier/django-storages/pull/938
.. _#994: https://github.com/jschneier/django-storages/pull/994
.. _#1063: https://github.com/jschneier/django-storages/pull/1063
1.11.1 (2020-12-23)
S3
- Revert fix for
ValueError: I/O operation on closed filewhen callingcollectstaticand introduceS3StaticStorageandS3ManifestStaticStoragefor use asSTATICFILES_STORAGEtargets (#968_)
.. _#968: https://github.com/jschneier/django-storages/pull/968
1.11 (2020-12-16)
General
- Test against Python 3.9 (
#964_)
S3
- Fix
ValueError: I/O operation on closed filewhen callingcollectstatic(#382,#955) - Calculate
S3Boto3StorageFile.buffer_size(via settingAWS_S3_FILE_BUFFER_SIZE) at run-time rather than import-time. (#930_) - Fix writing
bytearraycontent (#958,#965)
Google Cloud
- Add setting
GS_QUERYSTRING_AUTHto avoid signing URLs. This is useful for buckets with a policy of Uniform public read (#952_)
Azure
- Add
AZURE_OBJECT_PARAMETERSand overridableAzureStorage.get_object_parametersto customizeContentSettingsparameters for all keys and per-key respectively. (#898_)
.. _#382: https://github.com/jschneier/django-storages/issues/382 .. _#955: https://github.com/jschneier/django-storages/pull/955 .. _#930: https://github.com/jschneier/django-storages/pull/930 .. _#952: https://github.com/jschneier/django-storages/pull/952 .. _#898: https://github.com/jschneier/django-storages/pull/898 .. _#964: https://github.com/jschneier/django-storages/pull/964 .. _#958: https://github.com/jschneier/django-storages/issues/958 .. _#965: https://github.com/jschneier/django-storages/pull/965
1.10.1 (2020-09-13)
S3
- Restore
AWS_DEFAULT_ACLhandling. This setting is ignored ifACLis set inAWS_S3_OBJECT_PARAMETERS(#934_)
SFTP
- Fix using
SFTP_STORAGE_HOST(#926_)
.. _#926: https://github.com/jschneier/django-storages/pull/926 .. _#934: https://github.com/jschneier/django-storages/pull/934
1.10 (2020-08-30)
General
- Breaking: Removed support for end-of-life Python 2.7 and 3.4 (
#709_) - Breaking: Removed support for end-of-life Django 1.11 (
#891_) - Add support for Django 3.1 (
#916_) - Introduce a new
BaseStorageclass with aget_default_settingsmethod and use it inS3Boto3Storage,AzureStorage,GoogleCloudStorage, andSFTPStorage. These backends now calculate their settings when instantiated, not imported. (#524,#852)
S3
- Breaking: Automatic bucket creation has been removed. Doing so encourages using overly broad credentials.
As a result, support for the corresponding
AWS_BUCKET_ACLandAWS_AUTO_CREATE_BUCKETsettings have been removed. (#636_) - Breaking: Support for the undocumented setting
AWS_PRELOAD_METADATAhas been removed (#636_) - Breaking: The constructor kwarg
aclis no longer accepted. Instead, use theACLkey in settingAWS_S3_OBJECT_PARAMETERS(#636_) - Breaking: The constructor kwarg
bucketis no longer accepted. Instead, usebucket_nameor theAWS_STORAGE_BUCKET_NAMEsetting (#636_) - Breaking: Support for setting
AWS_REDUCED_REDUNDANCYhas been removed. Replace withStorageClass=REDUCED_REDUNDANCYinAWS_S3_OBJECT_PARAMETERS(#636_) - Breaking: Support for setting
AWS_S3_ENCRYPTIONhas been removed. Replace withServerSideEncryption=AES256inAWS_S3_OBJECT_PARAMETERS(#636_) - Breaking: Support for setting
AWS_DEFAULT_ACLhas been removed. Replace withACLinAWS_S3_OBJECT_PARAMETERS(#636_) - Add
http_methodparameter to.urlmethod (#854_) - Add support for signing Cloudfront URLs to the
.urlmethod. You must setAWS_CLOUDFRONT_KEY,AWS_CLOUDFRONT_KEY_IDand install eithercryptography_ orrsa_ (#456,#587). See the docs for more info. URLs will only be signed ifAWS_QUERYSTRING_AUTHis set toTrue(#885_)
Google Cloud
- Breaking: Automatic bucket creation has been removed. Doing so encourages using overly broad credentials.
As a result, support for the corresponding
GS_AUTO_CREATE_BUCKETandGS_AUTO_CREATE_ACLsettings have been removed. (#894_)
Dropbox
- Add
DROPBOX_WRITE_MODEsetting to control e.g. overwriting behavior. Check the docs for more info (#873,#138)
SFTP
- Remove exception swallowing during ssh connection (
#835,#838)
FTP
- Add
FTP_STORAGE_ENCODINGsetting to set the filesystem encoding (#803_) - Support multiple nested paths for files (
#886_)
.. _cryptography: https://cryptography.io .. _rsa: https://stuvel.eu/rsa .. _#885: https://github.com/jschneier/django-storages/pull/885 .. _#894: https://github.com/jschneier/django-storages/pull/894 .. _#636: https://github.com/jschneier/django-storages/pull/636 .. _#709: https://github.com/jschneier/django-storages/pull/709 .. _#891: https://github.com/jschneier/django-storages/pull/891 .. _#916: https://github.com/jschneier/django-storages/pull/916 .. _#852: https://github.com/jschneier/django-storages/pull/852 .. _#873: https://github.com/jschneier/django-storages/pull/873 .. _#854: https://github.com/jschneier/django-storages/pull/854 .. _#138: https://github.com/jschneier/django-storages/issues/138 .. _#524: https://github.com/jschneier/django-storages/pull/524 .. _#835: https://github.com/jschneier/django-storages/issues/835 .. _#838: https://github.com/jschneier/django-storages/pull/838 .. _#803: https://github.com/jschneier/django-storages/pull/803 .. _#456: https://github.com/jschneier/django-storages/issues/456 .. _#587: https://github.com/jschneier/django-storages/pull/587 .. _#886: https://github.com/jschneier/django-storages/pull/886
1.9.1 (2020-02-03)
S3
- Fix reading files with
S3Boto3StorageFile(#831,#833)
.. _#831: https://github.com/jschneier/django-storages/issues/831 .. _#833: https://github.com/jschneier/django-storages/pull/833
1.9 (2020-02-02)
General
- Breaking: The long deprecated S3 backend based on
botohas been removed. (#825_) - Test against and support Python 3.8 (
#810_)
S3
- Deprecated: Automatic bucket creation will be removed in version 1.10 (
#826_) - Deprecated: The undocumented
AWS_PRELOAD_METADATAand associated functionality will be removed in version 1.10 (#829_) - Deprecated: Support for
AWS_REDUCED_REDUNDANCYwill be removed in version 1.10 Replace withStorageClass=REDUCED_REDUNDANCYinAWS_S3_OBJECT_PARAMETERS(#829_) - Deprecated: Support for
AWS_S3_ENCRYPTIONwill be removed in version 1.10 (#829_) Replace withServerSideEncryption=AES256inAWS_S3_OBJECT_PARAMETERS - A custom
ContentEncodingis no longer overwritten automatically (note that specifying one will disable automaticgzip) (#391,#828). - Add
S3Boto3Storage.get_object_parameters, an overridable method for customizing upload parameters on a per-object basis (#819,#828) - Opening and closing a file in
wmode without writing anything will now create an empty file in S3, this mimics the builtinopenand Django's ownFileSystemStorage(#435,#816) - Fix reading a file in text mode (
#404,#827)
Google Cloud
- Deprecated: Automatic bucket creation will be removed in version 1.10 (
#826_)
Dropbox
- Fix crash on
DropBoxStorage.listdir(#762_) - Settings can now additionally be specified at the class level to ease subclassing (
#745_)
Libcloud
- Add support for Backblaze B2 to
LibCloudStorage.url(#807_)
FTP
- Fix creating multiple intermediary directories on Windows (
#823,#824)
.. _#825: https://github.com/jschneier/django-storages/pull/825 .. _#826: https://github.com/jschneier/django-storages/pull/826 .. _#829: https://github.com/jschneier/django-storages/pull/829 .. _#391: https://github.com/jschneier/django-storages/issues/391 .. _#828: https://github.com/jschneier/django-storages/pull/828 .. _#819: https://github.com/jschneier/django-storages/issues/819 .. _#810: https://github.com/jschneier/django-storages/pull/810 .. _#435: https://github.com/jschneier/django-storages/issues/435 .. _#816: https://github.com/jschneier/django-storages/pull/816 .. _#404: https://github.com/jschneier/django-storages/issues/404 .. _#827: https://github.com/jschneier/django-storages/pull/827 .. _#762: https://github.com/jschneier/django-storages/pull/762 .. _#745: https://github.com/jschneier/django-storages/pull/745 .. _#807: https://github.com/jschneier/django-storages/pull/807 .. _#823: https://github.com/jschneier/django-storages/issues/823 .. _#824: https://github.com/jschneier/django-storages/pull/824
1.8 (2019-11-20)
General
- Add support for Django 3.0 (
#759_) - Update license identifier to unambiguous
BSD-3-Clause
S3
- Include error message raised when missing library is imported (
#776,#793)
- Breaking The minimum supported version of
google-cloud-storageis now1.15.0which enables... - Add setting
GS_CUSTOM_ENDPOINTto allow usage of custom domains (#775,#648)
Azure
- Fix extra installation by pinning version to < 12 (
#785_) - Add support for setting
AZURE_CACHE_CONTROLheader (#780,#674)
.. _#759: https://github.com/jschneier/django-storages/pull/759 .. _#776: https://github.com/jschneier/django-storages/issues/776 .. _#793: https://github.com/jschneier/django-storages/pull/793 .. _#775: https://github.com/jschneier/django-storages/issues/775 .. _#648: https://github.com/jschneier/django-storages/pull/648 .. _#785: https://github.com/jschneier/django-storages/pull/785 .. _#780: https://github.com/jschneier/django-storages/pull/780 .. _#674: https://github.com/jschneier/django-storages/issues/674
1.7.2 (2019-09-10)
S3
- Avoid misleading
AWS_DEFAULT_ACLwarning for insecuredefault_aclwhen overridden as a class variable (#591_) - Propagate file deletion to cache when
preload_metadataisTrue, (not the default) (#743,#749) - Fix exception raised on closed file (common if using
ManifestFilesMixinorcollectstatic. (#382,#754)
Azure
- Pare down the required packages in
extra_requireswhen installing theazureextra to onlyazure-storage-blob(#680,#684) - Fix compatability with
generate_blob_shared_access_signatureupdated signature (#705,#723) - Fetching a file now uses the configured timeout rather than hardcoding one (
#727_) - Add support for configuring all blobservice options:
AZURE_ENDPOINT_SUFFIX,AZURE_CUSTOM_DOMAIN,AZURE_CONNECTION_STRING,AZURE_TOKEN_CREDENTIAL. See the docs for more info. Huge thanks once again to @nitely. (#750_) - Fix filename handling to not strip special characters (
#609,#752)
Google Cloud
- Set the file acl in the same call that uploads it (
#698_) - Reduce the number of queries and required permissions when
GS_AUTO_CREATE_BUCKETisFalse(the default) (#412,#718) - Set the
predefined_aclwhen creating aGoogleCloudFileusing.write(#640,#756) - Add
GS_BLOB_CHUNK_SIZEsetting to enable efficient uploading of large files (#757_)
Dropbox
- Complete migration to v2 api with file fetching and metadata fixes (
#724_) - Add
DROPBOX_TIMEOUTto configure client timeout defaulting to 100 seconds to match the underlying sdk. (#419,#747)
SFTP
- Fix reopening a file (
#746_)
.. _#591: https://github.com/jschneier/django-storages/pull/591 .. _#680: https://github.com/jschneier/django-storages/issues/680 .. _#684: https://github.com/jschneier/django-storages/pull/684 .. _#698: https://github.com/jschneier/django-storages/pull/698 .. _#705: https://github.com/jschneier/django-storages/issues/705 .. _#723: https://github.com/jschneier/django-storages/pull/723 .. _#727: https://github.com/jschneier/django-storages/pull/727 .. _#746: https://github.com/jschneier/django-storages/pull/746 .. _#724: https://github.com/jschneier/django-storages/pull/724 .. _#412: https://github.com/jschneier/django-storages/pull/412 .. _#718: https://github.com/jschneier/django-storages/pull/718 .. _#743: https://github.com/jschneier/django-storages/issues/743 .. _#749: https://github.com/jschneier/django-storages/pull/749 .. _#750: https://github.com/jschneier/django-storages/pull/750 .. _#609: https://github.com/jschneier/django-storages/issues/609 .. _#752: https://github.com/jschneier/django-storages/pull/752 .. _#382: https://github.com/jschneier/django-storages/issues/382 .. _#754: https://github.com/jschneier/django-storages/pull/754 .. _#419: https://github.com/jschneier/django-storages/issues/419 .. _#747: https://github.com/jschneier/django-storages/pull/747 .. _#640: https://github.com/jschneier/django-storages/issues/640 .. _#756: https://github.com/jschneier/django-storages/pull/756 .. _#757: https://github.com/jschneier/django-storages/pull/757
1.7.1 (2018-09-06)
- Fix off-by-1 error in
get_available_namewheneverfile_overwriteoroverwrite_filesisTrue(#588,#589) - Change
S3Boto3Storage.listdir()to uselist_objectsinstead oflist_objects_v2to restore compatability with services implementing the S3 protocol that do not yet support the new method (#586,#590)
.. _#588: https://github.com/jschneier/django-storages/issues/588 .. _#589: https://github.com/jschneier/django-storages/pull/589 .. _#586: https://github.com/jschneier/django-storages/issues/586 .. _#590: https://github.com/jschneier/django-storages/pull/590
1.7 (2018-09-03)
Security
- The
S3BotoStorageandS3Boto3Storagebackends have an insecure default ACL ofpublic-read. It is recommended that all current users audit their bucket permissions. Support has been added for settingAWS_DEFAULT_ACL = NoneandAWS_BUCKET_ACL = Nonewhich causes all created files to inherit the bucket's ACL (and created buckets to inherit the Amazon account's default ACL). This will become the default in version 1.10 (forS3Boto3Storageonly sinceS3BotoStoragewill be removed in version 1.9, see below). Additionally, a warning is now raised ifAWS_DEFAULT_ACLorAWS_BUCKET_ACLis not explicitly set. (#381,#535,#579_)
Breaking
- The
AzureStoragebackend and documentation has been completely rewritten. It now depends onazureandazure-storage-bloband is vastly improved. Big thanks to @nitely and all other contributors along the way (#565_) - The
.url()method ofGoogleCloudStoragehas been completely reworked. Many use cases should require no changes and will experience a massive speedup. The.url()method no longer hits the network for public urls and generates signed urls (with a default of 1-day expiration, configurable viaGS_EXPIRATION) for non-public buckets. Check out the docs for more information. (#570_) - Various backends will now raise
ImproperlyConfiguredat runtime if their location (GS_LOCATION,AWS_LOCATION) begins with a leading/rather than silently stripping it. Verify yours does not. (#520_) - The long deprecated
GSBotoStoragebackend is removed. (#518_)
Deprecation
- The insecure default of
public-readforAWS_DEFAULT_ACLandAWS_BUCKET_ACLinS3Boto3Storagewill change to inherit the bucket's setting in version 1.10 (#579_) - The legacy
S3BotoBackendis deprecated and will be removed in version 1.9. It is strongly recommended to move to theS3Boto3Storagebackend for performance, stability and bugfix reasons. See theboto migration docs_ for step-by-step guidelines. (#578,#584) - The long aliased arguments to
S3Boto3Storageofaclandbucketare deprecated in favor ofbucket_nameanddefault_acl(#516_) - The minimum required version of
boto3will be increasing to1.4.4in the next major version ofdjango-storages. (#583_)
Features
- Add support for a file to inherit its bucket's ACL by setting
AWS_DEFAULT_ACL = None(#535_) - Add
GS_CACHE_CONTROLsetting forGoogleCloudStoragebackend (#411,#505) - Add documentation around using django-storages with Digital Ocean Spaces (
#521_) - Add support for Django 2.1 and Python 3.7 (
#530_) - Make
S3Boto3Storagepickleable (#551_) - Add automatic reconnection to
SFTPStorage(#563,#564) - Unconditionally set the security token in the boto backends (
b13efd_) - Improve efficiency of
.listdironS3Boto3Storage(#352_) - Add
AWS_S3_VERIFYto support custom certificates and disabling certificate verification toS3Boto3Storage(#486,#580) - Add
AWS_S3_PROXIESsetting toS3Boto3Storage(#583_) - Add a snazzy new logo. Big thanks to @reallinfo
Bugfixes
- Reset file read offset before passing to
GoogleCloudStorageandAzureStorage(#481,#581,#582_) - Fix various issues with multipart uploads in the S3 backends
(
#169,#160,#364,#449,#504,#506,#546_) - Fix
S3Boto3Storageto stream down large files (also disallowr+wmode) (#383,#548) - Fix
SFTPStorageFileto align with the coreFileabstraction (#487,#568) - Catch
IOErrorinSFTPStorage.delete(#568_) AzureStorage,GoogleCloudStorage,S3Boto3StorageandS3BotoStoragenow respectmax_lengthwhenfile_overwrite = True(#513,#554)- The S3 backends now consistently use
compresslevel=9(the Python stdlib default) for gzipped content (#572,#576) - Improve error message of
S3Boto3Storageduring an unexpected exception when automatically creating a bucket (#574,#577)
.. _#381: https://github.com/jschneier/django-storages/issues/381
.. _#535: https://github.com/jschneier/django-storages/pull/535
.. _#579: https://github.com/jschneier/django-storages/pull/579
.. _#565: https://github.com/jschneier/django-storages/pull/565
.. _#520: https://github.com/jschneier/django-storages/pull/520
.. _#518: https://github.com/jschneier/django-storages/pull/518
.. _#516: https://github.com/jschneier/django-storages/pull/516
.. _#481: https://github.com/jschneier/django-storages/pull/481
.. _#581: https://github.com/jschneier/django-storages/pull/581
.. _#582: https://github.com/jschneier/django-storages/pull/582
.. _#411: https://github.com/jschneier/django-storages/issues/411
.. _#505: https://github.com/jschneier/django-storages/pull/505
.. _#521: https://github.com/jschneier/django-storages/pull/521
.. _#169: https://github.com/jschneier/django-storages/pull/169
.. _#160: https://github.com/jschneier/django-storages/issues/160
.. _#364: https://github.com/jschneier/django-storages/pull/364
.. _#449: https://github.com/jschneier/django-storages/issues/449
.. _#504: https://github.com/jschneier/django-storages/pull/504
.. _#530: https://github.com/jschneier/django-storages/pull/530
.. _#506: https://github.com/jschneier/django-storages/pull/506
.. _#546: https://github.com/jschneier/django-storages/pull/546
.. _#383: https://github.com/jschneier/django-storages/issues/383
.. _#548: https://github.com/jschneier/django-storages/pull/548
.. _b13efd: b13efd92b3
.. _#551: https://github.com/jschneier/django-storages/pull/551
.. _#563: https://github.com/jschneier/django-storages/issues/563
.. _#564: https://github.com/jschneier/django-storages/pull/564
.. _#487: https://github.com/jschneier/django-storages/issues/487
.. _#568: https://github.com/jschneier/django-storages/pull/568
.. _#513: https://github.com/jschneier/django-storages/issues/513
.. _#554: https://github.com/jschneier/django-storages/pull/554
.. _#570: https://github.com/jschneier/django-storages/pull/570
.. _#572: https://github.com/jschneier/django-storages/issues/572
.. _#576: https://github.com/jschneier/django-storages/pull/576
.. _#352: https://github.com/jschneier/django-storages/pull/352
.. _#574: https://github.com/jschneier/django-storages/issues/574
.. _#577: https://github.com/jschneier/django-storages/pull/577
.. _#486: https://github.com/jschneier/django-storages/pull/486
.. _#580: https://github.com/jschneier/django-storages/pull/580
.. _#583: https://github.com/jschneier/django-storages/pull/583
.. _boto migration docs: https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#migrating-boto-to-boto3
.. _#578: https://github.com/jschneier/django-storages/pull/578
.. _#584: https://github.com/jschneier/django-storages/pull/584
1.6.6 (2018-03-26)
- You can now specify the backend you are using to install the necessary dependencies using
extra_requires. For examplepip install django-storages[boto3](#417_) - Add additional content-type detection fallbacks (
#406,#407) - Add
GS_LOCATIONsetting to specify subdirectory forGoogleCloudStorage(#355_) - Add support for uploading large files to
DropBoxStorage, fix saving files (#379,#378,#301_) - Drop support for Django 1.8 and Django 1.10 (and hence Python 3.3) (
#438_) - Implement
get_created_timeforGoogleCloudStorage(#464_)
.. _#417: https://github.com/jschneier/django-storages/pull/417 .. _#407: https://github.com/jschneier/django-storages/pull/407 .. _#406: https://github.com/jschneier/django-storages/issues/406 .. _#355: https://github.com/jschneier/django-storages/pull/355 .. _#379: https://github.com/jschneier/django-storages/pull/379 .. _#378: https://github.com/jschneier/django-storages/issues/378 .. _#301: https://github.com/jschneier/django-storages/issues/301 .. _#438: https://github.com/jschneier/django-storages/issues/438 .. _#464: https://github.com/jschneier/django-storages/pull/464
1.6.5 (2017-08-01)
- Fix Django 1.11 regression with gzipped content being saved twice
resulting in empty files (
#367,#371,#373_) - Fix the
mtimewhen gzipping content onS3Boto3Storage(#374_)
.. _#367: https://github.com/jschneier/django-storages/issues/367 .. _#371: https://github.com/jschneier/django-storages/pull/371 .. _#373: https://github.com/jschneier/django-storages/pull/373 .. _#374: https://github.com/jschneier/django-storages/pull/374
1.6.4 (2017-07-27)
- Files uploaded with
GoogleCloudStoragewill now set their appropriate mimetype (#320_) - Fix
DropBoxStorage.urlto work. (#357_) - Fix
S3Boto3StoragewhenAWS_PRELOAD_METADATA = True(#366_) - Fix
S3Boto3Storageuploading file-like objects without names (#195,#368) S3Boto3Storageis now threadsafe - a separate session is created on a per-thread basis (#268,#358)
.. _#320: https://github.com/jschneier/django-storages/pull/320 .. _#357: https://github.com/jschneier/django-storages/pull/357 .. _#366: https://github.com/jschneier/django-storages/pull/366 .. _#195: https://github.com/jschneier/django-storages/pull/195 .. _#368: https://github.com/jschneier/django-storages/pull/368 .. _#268: https://github.com/jschneier/django-storages/issues/268 .. _#358: https://github.com/jschneier/django-storages/pull/358
1.6.3 (2017-06-23)
- Revert default
AWS_S3_SIGNATURE_VERSIONto V2 to restore backwards compatability inS3Boto3. It's recommended that all new projects set this to be's3v4'. (#344_)
.. _#344: https://github.com/jschneier/django-storages/pull/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.GSBotoStoragegetting an unexpected kwarg. (#342_)
.. _#341: https://github.com/jschneier/django-storages/pull/341 .. _#342: https://github.com/jschneier/django-storages/pull/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_)
.. _e89db45: e89db451d7
.. _#336: https://github.com/jschneier/django-storages/pull/336
1.6 (2017-06-21)
- Breaking: Remove backends deprecated in v1.5.1 (
#280_) - Breaking:
DropBoxStoragehas 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
SFTPStoragebackend now checks for the existence of the fallback~/.ssh/known_hostsbefore 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. (#118,#325) - Breaking: The default version value for
AWS_S3_SIGNATURE_VERSIONis now's3v4'. No changes should be required (#335_) - Deprecation: The undocumented
gs.GSBotoStoragebackend. See the newgcloud.GoogleCloudStorageorapache_libcloud.LibCloudStoragebackends instead. (#236_) - Add a new backend,
gcloud.GoogleCloudStoragebased on thegoogle-cloudbindings. (#236_) - Pass in the location constraint when auto creating a bucket in
S3Boto3Storage(#257,#258) - Add support for reading
AWS_SESSION_TOKENandAWS_SECURITY_TOKENfrom the environment toS3Boto3StorageandS3BotoStorage. (#283_) - Fix Boto3 non-ascii filenames on Python 2.7 (
#216,#217) - Fix
collectstatictimezone handling in and addget_modified_timetoS3BotoStorage(#290_) - Add support for Django 1.11 (
#295_) - Add
projectkeyword support to GCS inLibCloudStoragebackend (#269_) - Files that have a guessable encoding (e.g. gzip or compress) will be uploaded with that Content-Encoding in
the
s3boto3backend (#263,#264) - The Dropbox backend now properly translates backslashes in Windows paths into forward slashes (
e52a127_) - The S3 backends now permit colons in the keys (
#248,#322)
.. _#217: https://github.com/jschneier/django-storages/pull/217
.. _#273: https://github.com/jschneier/django-storages/pull/273
.. _#216: https://github.com/jschneier/django-storages/issues/216
.. _#283: https://github.com/jschneier/django-storages/pull/283
.. _#280: https://github.com/jschneier/django-storages/pull/280
.. _#257: https://github.com/jschneier/django-storages/issues/257
.. _#258: https://github.com/jschneier/django-storages/pull/258
.. _#290: https://github.com/jschneier/django-storages/pull/290
.. _#295: https://github.com/jschneier/django-storages/pull/295
.. _#269: https://github.com/jschneier/django-storages/pull/269
.. _#263: https://github.com/jschneier/django-storages/issues/263
.. _#264: https://github.com/jschneier/django-storages/pull/264
.. _e52a127: e52a127523
.. _#236: https://github.com/jschneier/django-storages/pull/236
.. _#118: https://github.com/jschneier/django-storages/issues/118
.. _#325: https://github.com/jschneier/django-storages/pull/325
.. _#248: https://github.com/jschneier/django-storages/issues/248
.. _#322: https://github.com/jschneier/django-storages/pull/322
.. _#335: https://github.com/jschneier/django-storages/pull/335
1.5.2 (2017-01-13)
- Actually use
SFTP_STORAGE_HOSTinSFTPStoragebackend (#204_) - Fix
S3Boto3Storageto avoid race conditions in a multi-threaded WSGI environment (#238_) - Fix trying to localize a naive datetime when
settings.USE_TZisFalseinS3Boto3Storage.modified_time. (#235,#234) - Fix automatic bucket creation in
S3Boto3StoragewhenAWS_AUTO_CREATE_BUCKETisTrue(#196_) - Improve the documentation for the S3 backends
.. _#204: https://github.com/jschneier/django-storages/pull/204 .. _#238: https://github.com/jschneier/django-storages/pull/238 .. _#234: https://github.com/jschneier/django-storages/issues/234 .. _#235: https://github.com/jschneier/django-storages/pull/235 .. _#196: https://github.com/jschneier/django-storages/pull/196
1.5.1 (2016-09-13)
- Breaking: Drop support for Django 1.7 (
#185_) - Deprecation: hashpath, image, overwrite, mogile, symlinkorcopy, database, mogile, couchdb.
See (
#202_) to discuss maintenance going forward - Use a fixed
mtimeargument forGzipFileinS3BotoStorageandS3Boto3Storageto ensure a stable output for gzipped files - Use
.putfileobjinstead of.putinS3Boto3Storageto use the transfer manager, allowing files greater than 5GB to be put on S3 (#194_ ,#201_) - Update
S3Boto3Storagefor Django 1.10 (#181_) (get_modified_timeandget_accessed_time) - Fix bad kwarg name in
S3Boto3StoragewhenAWS_PRELOAD_METADATAisTrue(#189,#190)
.. _#202: https://github.com/jschneier/django-storages/issues/202 .. _#201: https://github.com/jschneier/django-storages/pull/201 .. _#194: https://github.com/jschneier/django-storages/issues/194 .. _#190: https://github.com/jschneier/django-storages/pull/190 .. _#189: https://github.com/jschneier/django-storages/issues/189 .. _#185: https://github.com/jschneier/django-storages/pull/185 .. _#181: https://github.com/jschneier/django-storages/pull/181
1.5.0 (2016-08-02)
- Add new backend
S3Boto3Storage(#179_) - Add a
strictoption toutils.setting(#176_) - Tests, documentation, fixing
.closeforSFTPStorage(#177_) - Tests, documentation, add
.readlinesforFTPStorage(#175_) - Tests and documentation for
DropBoxStorage(#174_) - Fix
MANIFEST.into not ship.pycfiles. (#145_) - Enable CI testing of Python 3.5 and fix test failure from api change (
#171_)
.. _#145: https://github.com/jschneier/django-storages/pull/145 .. _#171: https://github.com/jschneier/django-storages/pull/171 .. _#174: https://github.com/jschneier/django-storages/pull/174 .. _#175: https://github.com/jschneier/django-storages/pull/175 .. _#177: https://github.com/jschneier/django-storages/pull/177 .. _#176: https://github.com/jschneier/django-storages/pull/176 .. _#179: https://github.com/jschneier/django-storages/pull/179
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
s3botobackend. Compressable types such asapplication/javascriptwill still be gzipped. PR#122_ - Fix
DropBoxStorage.existscheck and addDropBoxStorage.url(#127_) - Add
GS_HOSTsetting (with a default ofGSConnection.DefaultHost) to fixGSBotoStorage. (#124,#125)
.. _#122: https://github.com/jschneier/django-storages/pull/122 .. _#127: https://github.com/jschneier/django-storages/pull/127 .. _#124: https://github.com/jschneier/django-storages/issues/124 .. _#125: https://github.com/jschneier/django-storages/pull/125
1.4 (2016-02-07)
- This package is now released on PyPI as
django-storages. Please update your requirements files todjango-storages==1.4.
1.3.2 (2016-01-26)
- Fix memory leak from not closing underlying temp file in
s3botobackend (#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.existsinS3BotoStorage- this prevents a crash when runningcollectstatic -con Django 1.9.1 (#112) fixed in#116
.. _#106: https://github.com/jschneier/django-storages/pull/106 .. _#96: https://github.com/jschneier/django-storages/pull/96 .. _#112: https://github.com/jschneier/django-storages/issues/112 .. _#116: https://github.com/jschneier/django-storages/pull/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_libcloudbackend [return the number of bytes asked for by.read, make.namenon-private, don't initialize to an emptyBytesIOobject] (#55_) - Fix multi-part uploads in
s3botobackend not respectingAWS_S3_ENCRYPTION(#94_) - Automatically gzip svg files (
#100_)
.. __: https://github.com/jschneier/django-storages/pull/45 .. _#76: https://github.com/jschneier/django-storages/pull/76 .. _#55: https://github.com/jschneier/django-storages/pull/55 .. _#94: https://github.com/jschneier/django-storages/pull/94 .. _#100: https://github.com/jschneier/django-storages/pull/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_extendedfrom s3boto storage - Add support for Django 1.8+ (
#36__) - Add
AWS_S3_PROXY_HOSTandAWS_S3_PROXY_PORTsettings for s3boto backend (#41_) - Fix Python3K compat issue in apache_libcloud (
#52_) - Fix Google Storage backend not respecting
GS_IS_GZIPPEDsetting (#51__,#60_) - Rename FTP
_nameattribute tonamewhich is what the DjangoFileapi is expecting (#70_) - Put
StorageMixinfirst in inheritance to maintain backwards compat with older versions of Django (#63_)
.. __: https://github.com/jschneier/django-storages/pull/36 .. _#41: https://github.com/jschneier/django-storages/pull/41 .. _#52: https://github.com/jschneier/django-storages/issues/52 .. __: https://github.com/jschneier/django-storages/pull/51 .. _#60: https://github.com/jschneier/django-storages/pull/60 .. _#70: https://github.com/jschneier/django-storages/pull/70 .. _#63: https://github.com/jschneier/django-storages/pull/63
1.2.3 (2015-03-14)
- Variety of FTP backend fixes (fix
exists, addmodified_time, remove call to non-existent function) (#26_) - Apparently the year changed to 2015
.. _#26: https://github.com/jschneier/django-storages/pull/26
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
S3BotoStoragedeconstructible (previously onlyS3BotoStorageFilewas deconstructible) (#19_)
.. _#21: https://github.com/jschneier/django-storages/pull/21 .. __: https://github.com/jschneier/django-storages/issues/20 .. _#19: https://github.com/jschneier/django-storages/pull/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_timecrashing on new files whenAWS_PRELOAD_METADATA=True(#11,#12__,#14)
.. _#11: https://github.com/jschneier/django-storages/pull/11 __ https://github.com/jschneier/django-storages/issues/12 .. _#14: https://github.com/jschneier/django-storages/pull/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_)
.. _#8: https://github.com/jschneier/django-storages/pull/8 .. _#5: https://github.com/jschneier/django-storages/pull/5 .. _#4: https://github.com/jschneier/django-storages/pull/4 .. _#1: https://github.com/jschneier/django-storages/issues/1 .. _#2: https://github.com/jschneier/django-storages/issues/2
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_
.. _#91: https://bitbucket.org/david/django-storages/pull-request/91/ .. _#90: https://bitbucket.org/david/django-storages/pull-request/90/ .. _#86: https://bitbucket.org/david/django-storages/pull-request/86/ .. _#188: https://bitbucket.org/david/django-storages/issue/188/s3boto-_clean_name-is-broken-and-leads-to .. _#85: https://bitbucket.org/david/django-storages/pull-request/85/ .. _#69: https://bitbucket.org/david/django-storages/pull-request/69/ .. _#66: https://bitbucket.org/david/django-storages/pull-request/66/ .. _#65: https://bitbucket.org/david/django-storages/pull-request/65/
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://
.. _#156: https://bitbucket.org/david/django-storages/issue/156/s3boto-backend-valueerror-time-data-thu-07
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
.. _#50: https://bitbucket.org/david/django-storages/pull-request/50/
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_
.. _#133: https://bitbucket.org/david/django-storages/issue/133/license-file-refers-to-incorrect-project .. _#44: https://bitbucket.org/david/django-storages/pull-request/44/ .. _#45: https://bitbucket.org/david/django-storages/pull-request/45/ .. _#43: https://bitbucket.org/david/django-storages/pull-request/43/ .. _#48: https://bitbucket.org/david/django-storages/pull-request/48/ .. _#46: https://bitbucket.org/david/django-storages/pull-request/46/ .. _#17: https://bitbucket.org/david/django-storages/pull-request/17/ .. _#105: https://bitbucket.org/david/django-storages/issue/105/add-option-to-produce-protocol-relative
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,#109and#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
.. _#36: https://bitbucket.org/david/django-storages/pull-request/36/ .. _#35: https://bitbucket.org/david/django-storages/pull-request/35/ .. _#57: https://bitbucket.org/david/django-storages/issue/57 .. _#20: https://bitbucket.org/david/django-storages/pull-request/20/ .. _#30: https://bitbucket.org/david/django-storages/pull-request/30/ .. _#108: https://bitbucket.org/david/django-storages/issue/108 .. _#109: https://bitbucket.org/david/django-storages/issue/109 .. _#110: https://bitbucket.org/david/django-storages/issue/110 .. _#111: https://bitbucket.org/david/django-storages/issue/111 .. _#16: https://bitbucket.org/david/django-storages/pull-request/16/ .. _#24: https://bitbucket.org/david/django-storages/pull-request/24/
1.1.4 (2012-01-06)
- Added PendingDeprecationWarning for mosso backend
- Merged pull request
#13_ from marcoala, addsSFTP_KNOWN_HOST_FILEsetting 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 https://django-storages.readthedocs.io/
- HashPathStorage uses self.exists now, fixes
#83_
.. _#13: https://bitbucket.org/david/django-storages/pull-request/13/a-version-of-sftp-storage-that-allows-you .. _#12: https://bitbucket.org/david/django-storages/pull-request/12/hashpathstorage-tests-deleted-my-projects .. _#10: https://bitbucket.org/david/django-storages/pull-request/10/support-django-mongodb-engine-040 .. _#40: https://bitbucket.org/david/django-storages/issue/40/deprecate-s3py-backend .. _#78: https://bitbucket.org/david/django-storages/issue/78/import-error .. _#83: https://bitbucket.org/david/django-storages/issue/6/symlinkorcopystorage-new-custom-storage
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
.. _#89: https://bitbucket.org/david/django-storages/issue/89/112-broke-the-mosso-backend .. _pull request #5: https://bitbucket.org/david/django-storages/pull-request/5/fixed-path-bug-and-added-testcase-for