django-storages


Namedjango-storages JSON
Version 1.14.3 PyPI version JSON
download
home_pageNone
SummarySupport for many storage backends in Django
upload_time2024-05-04 18:57:39
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseBSD-3-Clause
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            .. 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'

For detailed instructions on how to configure the backend of your choice please consult the documentation.

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.

.. _Tidelift: https://tidelift.com/subscription/pkg/pypi-django-storages?utm_source=pypi-django-storages&utm_medium=referral&utm_campaign=enterprise&utm_term=repo

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.

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.14.3 (2024-05-04)
*******************

General
-------

- Add support for Django 5.0 and Python 3.12 (`#1331`_)

S3
--

- Fix disabling CloudFront signing with class variables (`#1334`_)
- Fix ``AWS_S3_*`` environment variables lookup (`#1336`_)
- Add ``client_config/AWS_S3_CLIENT_CONFIG`` to configure advanced ``botocore`` settings (`#1386`_)

Google Cloud
------------

- Fix re-gzipping already gzipped files (`#1366`_)

SFTP
----

- Add ``SFTP_BASE_URL`` setting (`#1368`_)
- Fix saving files when ``SFTP_STORAGE_ROOT`` is set (`#1372`_)

FTP
---

- Add support for FTP TLS via ``ftps`` URLs (`#1320`_)
- Add support for passwords with urlchars (`#1329`_)

.. _#1331: https://github.com/jschneier/django-storages/pull/1331
.. _#1386: https://github.com/jschneier/django-storages/pull/1386
.. _#1372: https://github.com/jschneier/django-storages/pull/1372
.. _#1334: https://github.com/jschneier/django-storages/pull/1334
.. _#1336: https://github.com/jschneier/django-storages/pull/1336
.. _#1366: https://github.com/jschneier/django-storages/pull/1366
.. _#1368: https://github.com/jschneier/django-storages/pull/1368
.. _#1320: https://github.com/jschneier/django-storages/pull/1320
.. _#1329: https://github.com/jschneier/django-storages/pull/1329

1.14.2 (2023-10-08)
*******************

S3
--

- Fix re-opening of ``S3File`` (`#1321`_)
- Revert raising ``ImproperlyConfigured`` when no ``bucket_name`` is set (`#1322`_)

.. _#1321: https://github.com/jschneier/django-storages/pull/1321
.. _#1322: https://github.com/jschneier/django-storages/pull/1322

1.14.1 (2023-09-29)
*******************

Azure
-----

- Do not require both ``AccountName`` and ``AccountKey`` in ``connection_string`` (`#1312`_)

S3
--

- Work around boto3 closing the uploaded file (`#1303`_)
- Fix crash when cleaning up during aborted connection of ``S3File.write`` (`#1304`_)
- Raise ``FileNotFoundError`` when attempting to read the ``size`` of a non-existent file (`#1309`_)
- Move auth & CloudFront signer validation to init (`#1302`_)
- Raise ``ImproperlyConfigured`` if no ``bucket_name`` is set (`#1313`_)
- Fix tracking of ``S3File.closed`` (`#1311`_)

.. _#1303: https://github.com/jschneier/django-storages/pull/1303
.. _#1304: https://github.com/jschneier/django-storages/pull/1304
.. _#1309: https://github.com/jschneier/django-storages/pull/1309
.. _#1302: https://github.com/jschneier/django-storages/pull/1302
.. _#1313: https://github.com/jschneier/django-storages/pull/1313
.. _#1312: https://github.com/jschneier/django-storages/pull/1312
.. _#1311: https://github.com/jschneier/django-storages/pull/1311

1.14 (2023-09-04)
*******************

General
-------

- **Breaking**: Drop support for Django 4.0 (`#1235`_)
- **Breaking**: The long deprecated & removed (from Django) ``(modified|created|accessed)_time`` methods have been
  removed from the various storages, please replace with the ``get_(modified|created|accessed)_time`` methods
- Add support for saving ``pathlib.PurePath`` names (`#1278`_)
- Add support for Django 4.2 (`#1236`_)

Azure
-----

- Set ``account_(name|key)`` from ``connection_string`` if not provided (`#1225`_)

Dropbox
-------

- **Deprecated:** The name ``DropboxStorage.location`` has been deprecated, please rename to ``DropboxStorage.root_path``, a future version will
  remove support for the old name. (`#1251`_)
- Storage and related names with a captialized B have been changed to no longer have one e.g ``DropboxStorage`` has now replaced
  ``DropBoxStorage``. Aliases have been added so no change is necessary at this time. A future version might deprecate the old names. (`#1250`_)
- ``DropboxStorage`` now conforms to the ``BaseStorage`` interface (`#1251`_)
- Fix name mangling when saving with certain complex root paths (`#1279`_)

FTP
---

- Use setting ``BASE_URL`` if it is defined (`#1238`_)

Google Cloud
------------

- **Breaking**: Support for the deprecated ``GS_CACHE_CONTROL`` has been removed. Please set the ``cache_control`` parameter of
  ``GS_OBJECT_PARAMETERS`` instead. (`#1220`_)

Libcloud
--------

- Reading a file that does not exist will now raise ``FileNotFoundError`` (`#1191`_)

SFTP
----

- Add closing context manager for standalone usage to ensure connections are cleaned up (`#1253`_)

S3
--

- **Deprecated:** ``AWS_S3_USE_THREADS`` has been deprecated in favor of ``AWS_S3_TRANSFER_CONFIG`` (`#1280`_)
- **Important:** The namespace of this backend has changed from ``S3Boto3`` to ``S3``. There are no current plans
  to deprecate and remove the old namespace but please update if you can. All paths, imports, and classes that previously
  referred to ``s3boto`` are now ``s3``. E.g ``S3Boto3Storage`` has been changed to ``S3Storage`` and ``S3Boto3StorageFile``
  has been changed to ``S3File``. (`#1289`_). Additionally the install extra is now ``s3`` (`#1284`_)
- Add setting ``transfer_config/AWS_S3_TRANSFER_CONFIG`` to customize any of the ``TransferConfig`` properties (`#1280`_)
- Enable passing ``security_token`` to constructor (`#1246`_)
- Do not overwrite a returned ``ContentType`` from ``get_object_parameters`` (`#1281`_)
- Add support for setting ``cloudfront_key_id`` and ``cloudfront_key`` via Django 4.2's ``OPTIONS`` (`#1274`_)
- Fix ``S3File.closed`` (`#1249`_)
- Fix opening new files in write mode with ``S3File`` (`#1282`_)
- Fix ``S3File`` not respecting mode on ``readlines`` (`#1000`_)
- Fix saving files with string content (`#911`_)
- Fix retrieving files with SSE-C enabled (`#1286`_)

.. _#1280: https://github.com/jschneier/django-storages/pull/1280
.. _#1289: https://github.com/jschneier/django-storages/pull/1289
.. _#1284: https://github.com/jschneier/django-storages/pull/1284
.. _#1274: https://github.com/jschneier/django-storages/pull/1274
.. _#1281: https://github.com/jschneier/django-storages/pull/1281
.. _#1282: https://github.com/jschneier/django-storages/pull/1282
.. _#1279: https://github.com/jschneier/django-storages/pull/1279
.. _#1278: https://github.com/jschneier/django-storages/pull/1278
.. _#1235: https://github.com/jschneier/django-storages/pull/1235
.. _#1236: https://github.com/jschneier/django-storages/pull/1236
.. _#1225: https://github.com/jschneier/django-storages/pull/1225
.. _#1251: https://github.com/jschneier/django-storages/pull/1251
.. _#1250: https://github.com/jschneier/django-storages/pull/1250
.. _#1238: https://github.com/jschneier/django-storages/pull/1238
.. _#1220: https://github.com/jschneier/django-storages/pull/1220
.. _#1191: https://github.com/jschneier/django-storages/pull/1191
.. _#1253: https://github.com/jschneier/django-storages/pull/1253
.. _#1246: https://github.com/jschneier/django-storages/pull/1246
.. _#1249: https://github.com/jschneier/django-storages/pull/1249
.. _#1000: https://github.com/jschneier/django-storages/pull/1000
.. _#911: https://github.com/jschneier/django-storages/pull/911
.. _#1286: https://github.com/jschneier/django-storages/pull/1286

1.13.2 (2022-12-23)
*******************

General
-------

- Add support for Python 3.11 (`#1196`_)
- Add support for saving ``pathlib.Path`` names (`#1200`_)

S3
--

- Catch 404 errors when calling ``delete()`` (`#1201`_)

Azure
-----

- Use ``AZURE_CUSTOM_DOMAIN`` for retrieving blob URLs and storage URL for other operations (`#1176`_)

Google Cloud
------------

- Use ``DEFAULT_RETRY`` for 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 ``DropBoxStorage`` constructor 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_PROTOCOL`` from ``http:`` to ``https:`` and remove the
  undocumented ``AWS_S3_SECURE_URLS`` setting. You should only need to update your settings if you had updated either of
  these previously undocumented settings.  The default behavior of constructing an ``https:`` URL with a custom domain
  is unchanged (`#1164`_)
- Add ``AWS_S3_USE_THREADS`` to disable ``threading`` for compatibility with ``gevent`` (`#1112`_)

Dropbox
-------

- Add support for refresh tokens (`#1159`_)
- Ignore ``ApiError`` exception in ``url()`` (`#1158`_)

Azure
-----

- Restore support for ``AZURE_ENDPOINT_SUFFIX`` (`#1118`_)
- Replace deprecated ``download_to_stream`` with ``readinto`` (`#1113`_)
- Add ``AZURE_API_VERSION`` setting (`#1132`_)
- Fix ``get_modified_time()`` (`#1134`_)

Google Cloud
------------

- Add support for gzipping files via ``GS_IS_GZIPPED`` and ``GZIP_CONTENT_TYPES`` (`#980`_)
- Use ``GS_BLOB_CHUNK_SIZE`` with 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_DOMAIN`` with an account key credential (`#1082`_, `#1083`_)

SFTP
----

- Catch ``FileNotFoundError`` instead of ``OSerror`` in ``.exists()`` to prevent swallowing ``socket.timeout`` exceptions (`#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 ``parameters`` kwarg to ``AzureStorage.url`` to configure blob properties in the SAS token (`#1071`_)
- Fix regression where ``AZURE_CUSTOM_DOMAIN`` was interpreted as a replacement of ``blob.core.windows.net`` rather 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 ``True`` for ``.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 settings ``AZURE_EMULATED_MODE``, ``AZURE_ENDPOINT_SUFFIX``, and ``AZURE_CUSTOM_CONNECTION_STRING`` are now ignored. (`#784`_, `#805`_)
- Add support for user delegation keys (`#1063`_)

Google Cloud
------------

- **Breaking**: The minimum required version of ``google-cloud-storage`` is now 1.27.0 (`#994`_)
- **Breaking**: Switch URL signing version from v2 to v4 (`#994`_)
- **Deprecated**: Support for ``GS_CACHE_CONTROL`` will be removed in 1.13. Please set the ``cache_control`` parameter of ``GS_OBJECT_PARAMETERS`` instead. (`#970`_)
- Add ``GS_OBJECT_PARAMETERS`` and overridable ``GoogleCloudStorage.get_object_parameters`` to customize blob parameters for all blobs and per-blob respectively. (`#970`_)
- Catch the ``NotFound`` exception 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_mode`` param (`#1020`_)

.. _fbe9538: https://github.com/jschneier/django-storages/commit/fbe9538b8574cfb0d95b04c9c477650dbfe8547b
.. _66f4f8e: https://github.com/jschneier/django-storages/commit/66f4f8ec68daaac767c013d6b1a30cf26a7ac1ca
.. _#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 file`` when calling ``collectstatic`` and
  introduce ``S3StaticStorage`` and ``S3ManifestStaticStorage`` for use as ``STATICFILES_STORAGE`` targets (`#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 file`` when calling ``collectstatic`` (`#382`_, `#955`_)
- Calculate ``S3Boto3StorageFile.buffer_size`` (via setting ``AWS_S3_FILE_BUFFER_SIZE``)
  at run-time rather than import-time. (`#930`_)
- Fix writing ``bytearray`` content (`#958`_, `#965`_)

Google Cloud
------------

- Add setting ``GS_QUERYSTRING_AUTH`` to avoid signing URLs. This is useful for buckets with a
  policy of Uniform public read (`#952`_)

Azure
-----

- Add ``AZURE_OBJECT_PARAMETERS`` and overridable ``AzureStorage.get_object_parameters`` to customize
  ``ContentSettings`` parameters 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_ACL`` handling. This setting is ignored if ``ACL`` is set in
  ``AWS_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 ``BaseStorage`` class with a ``get_default_settings`` method and use
  it in ``S3Boto3Storage``, ``AzureStorage``, ``GoogleCloudStorage``, and ``SFTPStorage``. 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_ACL`` and ``AWS_AUTO_CREATE_BUCKET`` settings have been removed. (`#636`_)
- **Breaking**: Support for the undocumented setting ``AWS_PRELOAD_METADATA`` has been removed (`#636`_)
- **Breaking**: The constructor kwarg ``acl`` is no longer accepted. Instead, use the ``ACL`` key in setting ``AWS_S3_OBJECT_PARAMETERS``
  (`#636`_)
- **Breaking**: The constructor kwarg ``bucket`` is no longer accepted. Instead, use ``bucket_name`` or the ``AWS_STORAGE_BUCKET_NAME``
  setting (`#636`_)
- **Breaking**: Support for setting ``AWS_REDUCED_REDUNDANCY`` has been removed. Replace with ``StorageClass=REDUCED_REDUNDANCY``
  in ``AWS_S3_OBJECT_PARAMETERS`` (`#636`_)
- **Breaking**: Support for setting ``AWS_S3_ENCRYPTION`` has been removed. Replace with ``ServerSideEncryption=AES256`` in ``AWS_S3_OBJECT_PARAMETERS`` (`#636`_)
- **Breaking**: Support for setting ``AWS_DEFAULT_ACL`` has been removed. Replace with ``ACL`` in ``AWS_S3_OBJECT_PARAMETERS`` (`#636`_)
- Add ``http_method`` parameter to ``.url`` method (`#854`_)
- Add support for signing Cloudfront URLs to the ``.url`` method. You must set ``AWS_CLOUDFRONT_KEY``,
  ``AWS_CLOUDFRONT_KEY_ID`` and install either `cryptography`_ or `rsa`_ (`#456`_, `#587`_). See the docs for more info.
  URLs will only be signed if ``AWS_QUERYSTRING_AUTH`` is set to ``True`` (`#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_BUCKET`` and ``GS_AUTO_CREATE_ACL`` settings have been removed. (`#894`_)

Dropbox
-------

- Add ``DROPBOX_WRITE_MODE`` setting 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_ENCODING`` setting 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 ``boto`` has 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_METADATA`` and associated functionality will
  be removed in version 1.10 (`#829`_)
- **Deprecated**: Support for ``AWS_REDUCED_REDUNDANCY`` will be removed in version 1.10
  Replace with ``StorageClass=REDUCED_REDUNDANCY`` in ``AWS_S3_OBJECT_PARAMETERS`` (`#829`_)
- **Deprecated**: Support for ``AWS_S3_ENCRYPTION`` will be removed in version 1.10 (`#829`_)
  Replace with ``ServerSideEncryption=AES256`` in ``AWS_S3_OBJECT_PARAMETERS``
- A custom ``ContentEncoding`` is no longer overwritten automatically (note that specifying
  one will disable automatic ``gzip``) (`#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 `w` mode without writing anything will now create an empty file
  in S3, this mimics the builtin ``open`` and Django's own ``FileSystemStorage`` (`#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`_)

Google
------

- **Breaking** The minimum supported version of ``google-cloud-storage`` is now ``1.15.0`` which enables...
- Add setting ``GS_CUSTOM_ENDPOINT`` to allow usage of custom domains (`#775`_, `#648`_)

Azure
-----

- Fix extra installation by pinning version to < 12 (`#785`_)
- Add support for setting ``AZURE_CACHE_CONTROL`` header (`#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_ACL`` warning for insecure ``default_acl`` when
  overridden as a class variable (`#591`_)
- Propagate file deletion to cache when ``preload_metadata`` is ``True``,
  (not the default) (`#743`_, `#749`_)
- Fix exception raised on closed file (common if using ``ManifestFilesMixin`` or
  ``collectstatic``. (`#382`_, `#754`_)

Azure
-----

- Pare down the required packages in ``extra_requires`` when installing the ``azure`` extra to only
  ``azure-storage-blob`` (`#680`_, `#684`_)
- Fix compatibility with ``generate_blob_shared_access_signature`` updated 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_BUCKET`` is
  ``False`` (the default) (`#412`_, `#718`_)
- Set the ``predefined_acl`` when creating a ``GoogleCloudFile`` using ``.write``
  (`#640`_, `#756`_)
- Add ``GS_BLOB_CHUNK_SIZE`` setting to enable efficient uploading of large files (`#757`_)

Dropbox
-------

- Complete migration to v2 api with file fetching and metadata fixes (`#724`_)
- Add ``DROPBOX_TIMEOUT`` to 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_name`` whenever ``file_overwrite`` or ``overwrite_files`` is ``True`` (`#588`_, `#589`_)
- Change ``S3Boto3Storage.listdir()`` to use ``list_objects`` instead of ``list_objects_v2`` to restore
  compatibility 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 ``S3BotoStorage`` and ``S3Boto3Storage`` backends have an insecure
  default ACL of ``public-read``. It is recommended that all current users audit their bucket
  permissions.  Support has been added for setting ``AWS_DEFAULT_ACL = None`` and ``AWS_BUCKET_ACL =
  None`` which 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 (for ``S3Boto3Storage`` only
  since ``S3BotoStorage`` will be removed in version 1.9, see below). Additionally, a warning is now
  raised if ``AWS_DEFAULT_ACL`` or ``AWS_BUCKET_ACL`` is not explicitly set. (`#381`_, `#535`_, `#579`_)

**Breaking**

- The ``AzureStorage`` backend and documentation has been completely rewritten. It now
  depends on ``azure`` and ``azure-storage-blob`` and is *vastly* improved. Big thanks to @nitely and all
  other contributors along the way (`#565`_)
- The ``.url()`` method of ``GoogleCloudStorage`` has 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
  via ``GS_EXPIRATION``) for non-public buckets.  Check out the docs for more information. (`#570`_)
- Various backends will now raise ``ImproperlyConfigured`` at 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 ``GSBotoStorage`` backend is removed. (`#518`_)

**Deprecation**

- The insecure default of ``public-read`` for ``AWS_DEFAULT_ACL`` and
  ``AWS_BUCKET_ACL`` in ``S3Boto3Storage`` will change to inherit the bucket's setting in version 1.10 (`#579`_)
- The legacy ``S3BotoBackend`` is deprecated and will be removed in version 1.9.
  It is strongly recommended to move to the ``S3Boto3Storage`` backend for performance,
  stability and bugfix reasons. See the `boto migration docs`_ for step-by-step guidelines. (`#578`_, `#584`_)
- The long aliased arguments to ``S3Boto3Storage`` of ``acl`` and ``bucket`` are
  deprecated in favor of ``bucket_name`` and ``default_acl`` (`#516`_)
- The minimum required version of ``boto3`` will be increasing to ``1.4.4`` in
  the next major version of ``django-storages``. (`#583`_)

**Features**

- Add support for a file to inherit its bucket's ACL by setting ``AWS_DEFAULT_ACL = None`` (`#535`_)
- Add ``GS_CACHE_CONTROL`` setting for ``GoogleCloudStorage`` backend (`#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 ``S3Boto3Storage`` pickleable (`#551`_)
- Add automatic reconnection to ``SFTPStorage`` (`#563`_, `#564`_)
- Unconditionally set the security token in the boto backends (`b13efd`_)
- Improve efficiency of ``.listdir`` on ``S3Boto3Storage`` (`#352`_)
- Add ``AWS_S3_VERIFY`` to support custom certificates and disabling certificate verification
  to ``S3Boto3Storage`` (`#486`_, `#580`_)
- Add ``AWS_S3_PROXIES`` setting to ``S3Boto3Storage`` (`#583`_)
- Add a snazzy new logo. Big thanks to @reallinfo

**Bugfixes**

- Reset file read offset before passing to ``GoogleCloudStorage`` and ``AzureStorage`` (`#481`_, `#581`_, `#582`_)
- Fix various issues with multipart uploads in the S3 backends
  (`#169`_, `#160`_, `#364`_, `#449`_, `#504`_, `#506`_, `#546`_)
- Fix ``S3Boto3Storage`` to stream down large files (also disallow `r+w` mode) (`#383`_, `#548`_)
- Fix ``SFTPStorageFile`` to align with the core ``File`` abstraction (`#487`_, `#568`_)
- Catch ``IOError`` in ``SFTPStorage.delete`` (`#568`_)
- ``AzureStorage``, ``GoogleCloudStorage``, ``S3Boto3Storage`` and ``S3BotoStorage`` now
  respect ``max_length`` when ``file_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 ``S3Boto3Storage`` during 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: https://github.com/jschneier/django-storages/commit/b13efd92b3bf3e9967b8e7819224bfcf9abb977e
.. _#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 example ``pip install django-storages[boto3]`` (`#417`_)
* Add additional content-type detection fallbacks (`#406`_, `#407`_)
* Add ``GS_LOCATION`` setting to specify subdirectory for ``GoogleCloudStorage`` (`#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_time`` for ``GoogleCloudStorage`` (`#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 ``mtime`` when gzipping content on ``S3Boto3Storage`` (`#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 ``GoogleCloudStorage`` will now set their appropriate mimetype (`#320`_)
* Fix ``DropBoxStorage.url`` to work. (`#357`_)
* Fix ``S3Boto3Storage`` when ``AWS_PRELOAD_METADATA = True`` (`#366`_)
* Fix ``S3Boto3Storage`` uploading file-like objects without names (`#195`_, `#368`_)
* ``S3Boto3Storage`` is 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_VERSION`` to V2 to restore backwards
  compatibility in ``S3Boto3``. 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.GSBotoStorage`` getting 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: https://github.com/jschneier/django-storages/commit/e89db451d7e617638b5991e31df4c8de196546a6
.. _#336: https://github.com/jschneier/django-storages/pull/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. (`#118`_, `#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 (`#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: https://github.com/jschneier/django-storages/commit/e52a127523fdd5be50bb670ccad566c5d527f3d1
.. _#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_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

.. _#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 ``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`_)

.. _#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 `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 ``MANIFEST.in`` to not ship ``.pyc`` files. (`#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 ``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``.
  (`#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 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`_

.. _#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_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`_)

.. __: 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_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`_)

.. __: 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``, add ``modified_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 ``S3BotoStorage`` deconstructible (previously only ``S3BotoStorageFile`` was 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_time`` crashing on new files when ``AWS_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`_, `#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

.. _#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, 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 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

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "django-storages",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "Josh Schneier <josh.schneier@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/10/96/eb5666d3f68f929db2ff8254279e65c55f7c323c0042d2c59f77a72df12a/django-storages-1.14.3.tar.gz",
    "platform": null,
    "description": ".. image:: https://raw.githubusercontent.com/jschneier/django-storages/master/docs/logos/horizontal.png\n    :alt: Django-Storages\n    :width: 100%\n\n.. image:: https://img.shields.io/pypi/v/django-storages.svg\n    :target: https://pypi.org/project/django-storages/\n    :alt: PyPI Version\n\n.. image:: https://github.com/jschneier/django-storages/actions/workflows/ci.yml/badge.svg\n    :target: https://github.com/jschneier/django-storages/actions/workflows/ci.yml\n    :alt: Build Status\n\nInstallation\n============\nInstalling from PyPI is as easy as doing:\n\n.. code-block:: bash\n\n  pip install django-storages\n\nIf you'd prefer to install from source (maybe there is a bugfix in master that\nhasn't been released yet) then the magic incantation you are looking for is:\n\n.. code-block:: bash\n\n  pip install -e 'git+https://github.com/jschneier/django-storages.git#egg=django-storages'\n\nFor detailed instructions on how to configure the backend of your choice please consult the documentation.\n\nAbout\n=====\ndjango-storages is a project to provide a variety of storage backends in a single library.\n\nThis library is usually compatible with the currently supported versions of\nDjango. Check the Trove classifiers in setup.py to be sure.\n\ndjango-storages is backed in part by `Tidelift`_. Check them out for all of your enterprise open source\nsoftware commercial support needs.\n\n.. _Tidelift: https://tidelift.com/subscription/pkg/pypi-django-storages?utm_source=pypi-django-storages&utm_medium=referral&utm_campaign=enterprise&utm_term=repo\n\nSecurity\n========\n\nTo report a security vulnerability, please use the `Tidelift security contact`_. Tidelift will coordinate the\nfix and disclosure. Please **do not** post a public issue on the tracker.\n\n.. _Tidelift security contact: https://tidelift.com/security\n\n\nFound a Bug?\n============\n\nIssues are tracked via GitHub issues at the `project issue page\n<https://github.com/jschneier/django-storages/issues>`_.\n\nDocumentation\n=============\nDocumentation for django-storages is located at https://django-storages.readthedocs.io/.\n\nContributing\n============\n\n#. `Check for open issues\n   <https://github.com/jschneier/django-storages/issues>`_ at the project\n   issue page or open a new issue to start a discussion about a feature or bug.\n#. Fork the `django-storages repository on GitHub\n   <https://github.com/jschneier/django-storages>`_ to start making changes.\n#. Add a test case to show that the bug is fixed or the feature is implemented\n   correctly.\n#. Bug me until I can merge your pull request.\n\nPlease don't update the library version in CHANGELOG.rst or ``storages/__init__.py``, the maintainer will do that on release.\n\nHistory\n=======\nThis repo began as a fork of the original library under the package name of django-storages-redux and\nbecame the official successor (releasing under django-storages on PyPI) in February of 2016.\n\ndjango-storages CHANGELOG\n=========================\n\n1.14.3 (2024-05-04)\n*******************\n\nGeneral\n-------\n\n- Add support for Django 5.0 and Python 3.12 (`#1331`_)\n\nS3\n--\n\n- Fix disabling CloudFront signing with class variables (`#1334`_)\n- Fix ``AWS_S3_*`` environment variables lookup (`#1336`_)\n- Add ``client_config/AWS_S3_CLIENT_CONFIG`` to configure advanced ``botocore`` settings (`#1386`_)\n\nGoogle Cloud\n------------\n\n- Fix re-gzipping already gzipped files (`#1366`_)\n\nSFTP\n----\n\n- Add ``SFTP_BASE_URL`` setting (`#1368`_)\n- Fix saving files when ``SFTP_STORAGE_ROOT`` is set (`#1372`_)\n\nFTP\n---\n\n- Add support for FTP TLS via ``ftps`` URLs (`#1320`_)\n- Add support for passwords with urlchars (`#1329`_)\n\n.. _#1331: https://github.com/jschneier/django-storages/pull/1331\n.. _#1386: https://github.com/jschneier/django-storages/pull/1386\n.. _#1372: https://github.com/jschneier/django-storages/pull/1372\n.. _#1334: https://github.com/jschneier/django-storages/pull/1334\n.. _#1336: https://github.com/jschneier/django-storages/pull/1336\n.. _#1366: https://github.com/jschneier/django-storages/pull/1366\n.. _#1368: https://github.com/jschneier/django-storages/pull/1368\n.. _#1320: https://github.com/jschneier/django-storages/pull/1320\n.. _#1329: https://github.com/jschneier/django-storages/pull/1329\n\n1.14.2 (2023-10-08)\n*******************\n\nS3\n--\n\n- Fix re-opening of ``S3File`` (`#1321`_)\n- Revert raising ``ImproperlyConfigured`` when no ``bucket_name`` is set (`#1322`_)\n\n.. _#1321: https://github.com/jschneier/django-storages/pull/1321\n.. _#1322: https://github.com/jschneier/django-storages/pull/1322\n\n1.14.1 (2023-09-29)\n*******************\n\nAzure\n-----\n\n- Do not require both ``AccountName`` and ``AccountKey`` in ``connection_string`` (`#1312`_)\n\nS3\n--\n\n- Work around boto3 closing the uploaded file (`#1303`_)\n- Fix crash when cleaning up during aborted connection of ``S3File.write`` (`#1304`_)\n- Raise ``FileNotFoundError`` when attempting to read the ``size`` of a non-existent file (`#1309`_)\n- Move auth & CloudFront signer validation to init (`#1302`_)\n- Raise ``ImproperlyConfigured`` if no ``bucket_name`` is set (`#1313`_)\n- Fix tracking of ``S3File.closed`` (`#1311`_)\n\n.. _#1303: https://github.com/jschneier/django-storages/pull/1303\n.. _#1304: https://github.com/jschneier/django-storages/pull/1304\n.. _#1309: https://github.com/jschneier/django-storages/pull/1309\n.. _#1302: https://github.com/jschneier/django-storages/pull/1302\n.. _#1313: https://github.com/jschneier/django-storages/pull/1313\n.. _#1312: https://github.com/jschneier/django-storages/pull/1312\n.. _#1311: https://github.com/jschneier/django-storages/pull/1311\n\n1.14 (2023-09-04)\n*******************\n\nGeneral\n-------\n\n- **Breaking**: Drop support for Django 4.0 (`#1235`_)\n- **Breaking**: The long deprecated & removed (from Django) ``(modified|created|accessed)_time`` methods have been\n  removed from the various storages, please replace with the ``get_(modified|created|accessed)_time`` methods\n- Add support for saving ``pathlib.PurePath`` names (`#1278`_)\n- Add support for Django 4.2 (`#1236`_)\n\nAzure\n-----\n\n- Set ``account_(name|key)`` from ``connection_string`` if not provided (`#1225`_)\n\nDropbox\n-------\n\n- **Deprecated:** The name ``DropboxStorage.location`` has been deprecated, please rename to ``DropboxStorage.root_path``, a future version will\n  remove support for the old name. (`#1251`_)\n- Storage and related names with a captialized B have been changed to no longer have one e.g ``DropboxStorage`` has now replaced\n  ``DropBoxStorage``. Aliases have been added so no change is necessary at this time. A future version might deprecate the old names. (`#1250`_)\n- ``DropboxStorage`` now conforms to the ``BaseStorage`` interface (`#1251`_)\n- Fix name mangling when saving with certain complex root paths (`#1279`_)\n\nFTP\n---\n\n- Use setting ``BASE_URL`` if it is defined (`#1238`_)\n\nGoogle Cloud\n------------\n\n- **Breaking**: Support for the deprecated ``GS_CACHE_CONTROL`` has been removed. Please set the ``cache_control`` parameter of\n  ``GS_OBJECT_PARAMETERS`` instead. (`#1220`_)\n\nLibcloud\n--------\n\n- Reading a file that does not exist will now raise ``FileNotFoundError`` (`#1191`_)\n\nSFTP\n----\n\n- Add closing context manager for standalone usage to ensure connections are cleaned up (`#1253`_)\n\nS3\n--\n\n- **Deprecated:** ``AWS_S3_USE_THREADS`` has been deprecated in favor of ``AWS_S3_TRANSFER_CONFIG`` (`#1280`_)\n- **Important:** The namespace of this backend has changed from ``S3Boto3`` to ``S3``. There are no current plans\n  to deprecate and remove the old namespace but please update if you can. All paths, imports, and classes that previously\n  referred to ``s3boto`` are now ``s3``. E.g ``S3Boto3Storage`` has been changed to ``S3Storage`` and ``S3Boto3StorageFile``\n  has been changed to ``S3File``. (`#1289`_). Additionally the install extra is now ``s3`` (`#1284`_)\n- Add setting ``transfer_config/AWS_S3_TRANSFER_CONFIG`` to customize any of the ``TransferConfig`` properties (`#1280`_)\n- Enable passing ``security_token`` to constructor (`#1246`_)\n- Do not overwrite a returned ``ContentType`` from ``get_object_parameters`` (`#1281`_)\n- Add support for setting ``cloudfront_key_id`` and ``cloudfront_key`` via Django 4.2's ``OPTIONS`` (`#1274`_)\n- Fix ``S3File.closed`` (`#1249`_)\n- Fix opening new files in write mode with ``S3File`` (`#1282`_)\n- Fix ``S3File`` not respecting mode on ``readlines`` (`#1000`_)\n- Fix saving files with string content (`#911`_)\n- Fix retrieving files with SSE-C enabled (`#1286`_)\n\n.. _#1280: https://github.com/jschneier/django-storages/pull/1280\n.. _#1289: https://github.com/jschneier/django-storages/pull/1289\n.. _#1284: https://github.com/jschneier/django-storages/pull/1284\n.. _#1274: https://github.com/jschneier/django-storages/pull/1274\n.. _#1281: https://github.com/jschneier/django-storages/pull/1281\n.. _#1282: https://github.com/jschneier/django-storages/pull/1282\n.. _#1279: https://github.com/jschneier/django-storages/pull/1279\n.. _#1278: https://github.com/jschneier/django-storages/pull/1278\n.. _#1235: https://github.com/jschneier/django-storages/pull/1235\n.. _#1236: https://github.com/jschneier/django-storages/pull/1236\n.. _#1225: https://github.com/jschneier/django-storages/pull/1225\n.. _#1251: https://github.com/jschneier/django-storages/pull/1251\n.. _#1250: https://github.com/jschneier/django-storages/pull/1250\n.. _#1238: https://github.com/jschneier/django-storages/pull/1238\n.. _#1220: https://github.com/jschneier/django-storages/pull/1220\n.. _#1191: https://github.com/jschneier/django-storages/pull/1191\n.. _#1253: https://github.com/jschneier/django-storages/pull/1253\n.. _#1246: https://github.com/jschneier/django-storages/pull/1246\n.. _#1249: https://github.com/jschneier/django-storages/pull/1249\n.. _#1000: https://github.com/jschneier/django-storages/pull/1000\n.. _#911: https://github.com/jschneier/django-storages/pull/911\n.. _#1286: https://github.com/jschneier/django-storages/pull/1286\n\n1.13.2 (2022-12-23)\n*******************\n\nGeneral\n-------\n\n- Add support for Python 3.11 (`#1196`_)\n- Add support for saving ``pathlib.Path`` names (`#1200`_)\n\nS3\n--\n\n- Catch 404 errors when calling ``delete()`` (`#1201`_)\n\nAzure\n-----\n\n- Use ``AZURE_CUSTOM_DOMAIN`` for retrieving blob URLs and storage URL for other operations (`#1176`_)\n\nGoogle Cloud\n------------\n\n- Use ``DEFAULT_RETRY`` for all upload & delete operations (`#1156`_)\n- Fix gzipping of content (`#1203`_)\n- Pass through kwargs to signed URL generator (`#1193`_)\n\nSFTP\n----\n\n- Improve write & memory performance when saving files (`#1194`_)\n\n.. _#1196: https://github.com/jschneier/django-storages/pull/1196\n.. _#1200: https://github.com/jschneier/django-storages/pull/1200\n.. _#1201: https://github.com/jschneier/django-storages/pull/1201\n.. _#1176: https://github.com/jschneier/django-storages/pull/1176\n.. _#1156: https://github.com/jschneier/django-storages/pull/1156\n.. _#1203: https://github.com/jschneier/django-storages/pull/1203\n.. _#1193: https://github.com/jschneier/django-storages/pull/1193\n.. _#1194: https://github.com/jschneier/django-storages/pull/1194\n\n1.13.1 (2022-08-06)\n*******************\n\nDropbox\n-------\n\n- Strip off the root path when saving files to fix saving with upgraded versions of Django (`#1168`_)\n- Update ``DropBoxStorage`` constructor parameter order to be backwards compatible (`#1167`_)\n\n.. _#1167: https://github.com/jschneier/django-storages/pull/1167\n.. _#1168: https://github.com/jschneier/django-storages/pull/1168\n\n1.13 (2022-08-05)\n*****************\n\nGeneral\n-------\n\n- Add support for Django 4.0 and 4.1 (`#1093`_)\n- Drop support for Django 2.2, 3.0 and 3.1 (`#1093`_)\n- Drop support for Python 3.5 and 3.6 (`#1093`_)\n\nS3\n--\n\n- **Breaking**: Update and document the undocumented ``AWS_S3_URL_PROTOCOL`` from ``http:`` to ``https:`` and remove the\n  undocumented ``AWS_S3_SECURE_URLS`` setting. You should only need to update your settings if you had updated either of\n  these previously undocumented settings.  The default behavior of constructing an ``https:`` URL with a custom domain\n  is unchanged (`#1164`_)\n- Add ``AWS_S3_USE_THREADS`` to disable ``threading`` for compatibility with ``gevent`` (`#1112`_)\n\nDropbox\n-------\n\n- Add support for refresh tokens (`#1159`_)\n- Ignore ``ApiError`` exception in ``url()`` (`#1158`_)\n\nAzure\n-----\n\n- Restore support for ``AZURE_ENDPOINT_SUFFIX`` (`#1118`_)\n- Replace deprecated ``download_to_stream`` with ``readinto`` (`#1113`_)\n- Add ``AZURE_API_VERSION`` setting (`#1132`_)\n- Fix ``get_modified_time()`` (`#1134`_)\n\nGoogle Cloud\n------------\n\n- Add support for gzipping files via ``GS_IS_GZIPPED`` and ``GZIP_CONTENT_TYPES`` (`#980`_)\n- Use ``GS_BLOB_CHUNK_SIZE`` with files that already exist (`#1154`_)\n\n.. _#980: https://github.com/jschneier/django-storages/pull/980\n.. _#1118: https://github.com/jschneier/django-storages/pull/1118\n.. _#1113: https://github.com/jschneier/django-storages/pull/1113\n.. _#1112: https://github.com/jschneier/django-storages/pull/1112\n.. _#1132: https://github.com/jschneier/django-storages/pull/1132\n.. _#1134: https://github.com/jschneier/django-storages/pull/1134\n.. _#1159: https://github.com/jschneier/django-storages/pull/1159\n.. _#1158: https://github.com/jschneier/django-storages/pull/1158\n.. _#1164: https://github.com/jschneier/django-storages/pull/1164\n.. _#1093: https://github.com/jschneier/django-storages/pull/1093\n.. _#1154: https://github.com/jschneier/django-storages/pull/1154\n\n\n1.12.3 (2021-10-29)\n*******************\n\nGeneral\n-------\n\n- Add support for Python 3.10 (`#1078`_)\n\nS3\n--\n\n- Re-raise non-404 errors in ``.exists()`` (`#1084`_, `#1085`_)\n\nAzure\n-----\n\n- Fix using ``AZURE_CUSTOM_DOMAIN`` with an account key credential (`#1082`_, `#1083`_)\n\nSFTP\n----\n\n- Catch ``FileNotFoundError`` instead of ``OSerror`` in ``.exists()`` to prevent swallowing ``socket.timeout`` exceptions (`#1064`_, `#1087`_)\n\n\n.. _#1078: https://github.com/jschneier/django-storages/pull/1078\n.. _#1084: https://github.com/jschneier/django-storages/issues/1084\n.. _#1085: https://github.com/jschneier/django-storages/pull/1085\n.. _#1082: https://github.com/jschneier/django-storages/issues/1082\n.. _#1083: https://github.com/jschneier/django-storages/pull/1083\n.. _#1064: https://github.com/jschneier/django-storages/issues/1064\n.. _#1087: https://github.com/jschneier/django-storages/pull/1087\n\n1.12.2 (2021-10-16)\n*******************\n\nAzure\n-----\n\n- Add ``parameters`` kwarg to ``AzureStorage.url`` to configure blob properties in the SAS token (`#1071`_)\n- Fix regression where ``AZURE_CUSTOM_DOMAIN`` was interpreted as a replacement of ``blob.core.windows.net`` rather than as a full domain\n  (`#1073`_, `#1076`_)\n\n.. _#1071: https://github.com/jschneier/django-storages/pull/1071\n.. _#1073: https://github.com/jschneier/django-storages/issues/1073\n.. _#1076: https://github.com/jschneier/django-storages/pull/1076\n\n1.12.1 (2021-10-11)\n*******************\n\nS3\n--\n\n- Change gzip compression to use a streaming implementation (`#1061`_)\n- Fix saving files with ``S3ManifestStaticStorage`` (`#1068`_, `#1069`_)\n\n.. _#1061: https://github.com/jschneier/django-storages/pull/1061\n.. _#1068: https://github.com/jschneier/django-storages/issues/1068\n.. _#1069: https://github.com/jschneier/django-storages/pull/1069\n\n1.12 (2021-10-06)\n*****************\n\nGeneral\n-------\n- Add support for Django 3.2 (`#1046`_, `#1042`_, `#1005`_)\n- Replace Travis CI with GitHub actions (`#1051`_)\n\nS3\n--\n\n- Convert signing keys to bytes if necessary (`#1003`_)\n- Avoid a ListParts API call during multipart upload (`#1041`_)\n- Custom domains now use passed URL params (`#1054`_)\n- Allow the use of AWS profiles and clarify the options for passing credentials (`fbe9538`_)\n- Re-allow override of various access key names (`#1026`_)\n- Properly exclude empty folders during ``listdir`` (`66f4f8e`_)\n- Support saving file objects that are not ``seekable`` (`#860`_, `#1057`_)\n- Return ``True`` for ``.exists()`` if a non-404 error is encountered (`#938`_)\n\nAzure\n-----\n\n- **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 settings ``AZURE_EMULATED_MODE``, ``AZURE_ENDPOINT_SUFFIX``, and ``AZURE_CUSTOM_CONNECTION_STRING`` are now ignored. (`#784`_, `#805`_)\n- Add support for user delegation keys (`#1063`_)\n\nGoogle Cloud\n------------\n\n- **Breaking**: The minimum required version of ``google-cloud-storage`` is now 1.27.0 (`#994`_)\n- **Breaking**: Switch URL signing version from v2 to v4 (`#994`_)\n- **Deprecated**: Support for ``GS_CACHE_CONTROL`` will be removed in 1.13. Please set the ``cache_control`` parameter of ``GS_OBJECT_PARAMETERS`` instead. (`#970`_)\n- Add ``GS_OBJECT_PARAMETERS`` and overridable ``GoogleCloudStorage.get_object_parameters`` to customize blob parameters for all blobs and per-blob respectively. (`#970`_)\n- Catch the ``NotFound`` exception raised when deleting a non-existent blob, this matches Django and other backends (`#998`_, `#999`_)\n- Fix signing URLs with custom endpoints (`#994`_)\n\nDropbox\n-------\n\n- Validate ``write_mode`` param (`#1020`_)\n\n.. _fbe9538: https://github.com/jschneier/django-storages/commit/fbe9538b8574cfb0d95b04c9c477650dbfe8547b\n.. _66f4f8e: https://github.com/jschneier/django-storages/commit/66f4f8ec68daaac767c013d6b1a30cf26a7ac1ca\n.. _#1003: https://github.com/jschneier/django-storages/pull/1003\n.. _#1054: https://github.com/jschneier/django-storages/pull/1054\n.. _#1026: https://github.com/jschneier/django-storages/pull/1026\n.. _#1041: https://github.com/jschneier/django-storages/pull/1041\n.. _#970: https://github.com/jschneier/django-storages/pull/970\n.. _#998: https://github.com/jschneier/django-storages/issues/998\n.. _#784: https://github.com/jschneier/django-storages/issues/784\n.. _#805: https://github.com/jschneier/django-storages/pull/805\n.. _#999: https://github.com/jschneier/django-storages/pull/999\n.. _#1051: https://github.com/jschneier/django-storages/pull/1051\n.. _#1042: https://github.com/jschneier/django-storages/pull/1042\n.. _#1046: https://github.com/jschneier/django-storages/issues/1046\n.. _#1005: https://github.com/jschneier/django-storages/pull/1005\n.. _#1020: https://github.com/jschneier/django-storages/pull/1020\n.. _#860: https://github.com/jschneier/django-storages/issues/860\n.. _#1057: https://github.com/jschneier/django-storages/pull/1057\n.. _#938: https://github.com/jschneier/django-storages/pull/938\n.. _#994: https://github.com/jschneier/django-storages/pull/994\n.. _#1063: https://github.com/jschneier/django-storages/pull/1063\n\n1.11.1 (2020-12-23)\n*******************\n\nS3\n--\n\n- Revert fix for ``ValueError: I/O operation on closed file`` when calling ``collectstatic`` and\n  introduce ``S3StaticStorage`` and ``S3ManifestStaticStorage`` for use as ``STATICFILES_STORAGE`` targets (`#968`_)\n\n.. _#968: https://github.com/jschneier/django-storages/pull/968\n\n1.11 (2020-12-16)\n*****************\n\nGeneral\n-------\n\n- Test against Python 3.9 (`#964`_)\n\nS3\n--\n\n- Fix ``ValueError: I/O operation on closed file`` when calling ``collectstatic`` (`#382`_, `#955`_)\n- Calculate ``S3Boto3StorageFile.buffer_size`` (via setting ``AWS_S3_FILE_BUFFER_SIZE``)\n  at run-time rather than import-time. (`#930`_)\n- Fix writing ``bytearray`` content (`#958`_, `#965`_)\n\nGoogle Cloud\n------------\n\n- Add setting ``GS_QUERYSTRING_AUTH`` to avoid signing URLs. This is useful for buckets with a\n  policy of Uniform public read (`#952`_)\n\nAzure\n-----\n\n- Add ``AZURE_OBJECT_PARAMETERS`` and overridable ``AzureStorage.get_object_parameters`` to customize\n  ``ContentSettings`` parameters for all keys and per-key respectively. (`#898`_)\n\n.. _#382: https://github.com/jschneier/django-storages/issues/382\n.. _#955: https://github.com/jschneier/django-storages/pull/955\n.. _#930: https://github.com/jschneier/django-storages/pull/930\n.. _#952: https://github.com/jschneier/django-storages/pull/952\n.. _#898: https://github.com/jschneier/django-storages/pull/898\n.. _#964: https://github.com/jschneier/django-storages/pull/964\n.. _#958: https://github.com/jschneier/django-storages/issues/958\n.. _#965: https://github.com/jschneier/django-storages/pull/965\n\n1.10.1 (2020-09-13)\n*******************\n\nS3\n--\n\n- Restore ``AWS_DEFAULT_ACL`` handling. This setting is ignored if ``ACL`` is set in\n  ``AWS_S3_OBJECT_PARAMETERS`` (`#934`_)\n\nSFTP\n----\n\n- Fix using ``SFTP_STORAGE_HOST`` (`#926`_)\n\n.. _#926: https://github.com/jschneier/django-storages/pull/926\n.. _#934: https://github.com/jschneier/django-storages/pull/934\n\n1.10 (2020-08-30)\n*****************\n\nGeneral\n-------\n\n- **Breaking**: Removed support for end-of-life Python 2.7 and 3.4 (`#709`_)\n- **Breaking**: Removed support for end-of-life Django 1.11 (`#891`_)\n- Add support for Django 3.1 (`#916`_)\n- Introduce a new ``BaseStorage`` class with a ``get_default_settings`` method and use\n  it in ``S3Boto3Storage``, ``AzureStorage``, ``GoogleCloudStorage``, and ``SFTPStorage``. These backends\n  now calculate their settings when instantiated, not imported. (`#524`_, `#852`_)\n\nS3\n--\n\n- **Breaking**: Automatic bucket creation has been removed. Doing so encourages using overly broad credentials.\n  As a result, support for the corresponding ``AWS_BUCKET_ACL`` and ``AWS_AUTO_CREATE_BUCKET`` settings have been removed. (`#636`_)\n- **Breaking**: Support for the undocumented setting ``AWS_PRELOAD_METADATA`` has been removed (`#636`_)\n- **Breaking**: The constructor kwarg ``acl`` is no longer accepted. Instead, use the ``ACL`` key in setting ``AWS_S3_OBJECT_PARAMETERS``\n  (`#636`_)\n- **Breaking**: The constructor kwarg ``bucket`` is no longer accepted. Instead, use ``bucket_name`` or the ``AWS_STORAGE_BUCKET_NAME``\n  setting (`#636`_)\n- **Breaking**: Support for setting ``AWS_REDUCED_REDUNDANCY`` has been removed. Replace with ``StorageClass=REDUCED_REDUNDANCY``\n  in ``AWS_S3_OBJECT_PARAMETERS`` (`#636`_)\n- **Breaking**: Support for setting ``AWS_S3_ENCRYPTION`` has been removed. Replace with ``ServerSideEncryption=AES256`` in ``AWS_S3_OBJECT_PARAMETERS`` (`#636`_)\n- **Breaking**: Support for setting ``AWS_DEFAULT_ACL`` has been removed. Replace with ``ACL`` in ``AWS_S3_OBJECT_PARAMETERS`` (`#636`_)\n- Add ``http_method`` parameter to ``.url`` method (`#854`_)\n- Add support for signing Cloudfront URLs to the ``.url`` method. You must set ``AWS_CLOUDFRONT_KEY``,\n  ``AWS_CLOUDFRONT_KEY_ID`` and install either `cryptography`_ or `rsa`_ (`#456`_, `#587`_). See the docs for more info.\n  URLs will only be signed if ``AWS_QUERYSTRING_AUTH`` is set to ``True`` (`#885`_)\n\nGoogle Cloud\n------------\n\n- **Breaking**: Automatic bucket creation has been removed. Doing so encourages using overly broad credentials.\n  As a result, support for the corresponding ``GS_AUTO_CREATE_BUCKET`` and ``GS_AUTO_CREATE_ACL`` settings have been removed. (`#894`_)\n\nDropbox\n-------\n\n- Add ``DROPBOX_WRITE_MODE`` setting to control e.g. overwriting behavior. Check the docs\n  for more info (`#873`_, `#138`_)\n\nSFTP\n----\n\n- Remove exception swallowing during ssh connection (`#835`_, `#838`_)\n\nFTP\n---\n\n- Add ``FTP_STORAGE_ENCODING`` setting to set the filesystem encoding  (`#803`_)\n- Support multiple nested paths for files (`#886`_)\n\n.. _cryptography: https://cryptography.io\n.. _rsa: https://stuvel.eu/rsa\n.. _#885: https://github.com/jschneier/django-storages/pull/885\n.. _#894: https://github.com/jschneier/django-storages/pull/894\n.. _#636: https://github.com/jschneier/django-storages/pull/636\n.. _#709: https://github.com/jschneier/django-storages/pull/709\n.. _#891: https://github.com/jschneier/django-storages/pull/891\n.. _#916: https://github.com/jschneier/django-storages/pull/916\n.. _#852: https://github.com/jschneier/django-storages/pull/852\n.. _#873: https://github.com/jschneier/django-storages/pull/873\n.. _#854: https://github.com/jschneier/django-storages/pull/854\n.. _#138: https://github.com/jschneier/django-storages/issues/138\n.. _#524: https://github.com/jschneier/django-storages/pull/524\n.. _#835: https://github.com/jschneier/django-storages/issues/835\n.. _#838: https://github.com/jschneier/django-storages/pull/838\n.. _#803: https://github.com/jschneier/django-storages/pull/803\n.. _#456: https://github.com/jschneier/django-storages/issues/456\n.. _#587: https://github.com/jschneier/django-storages/pull/587\n.. _#886: https://github.com/jschneier/django-storages/pull/886\n\n1.9.1 (2020-02-03)\n******************\n\nS3\n--\n\n- Fix reading files with ``S3Boto3StorageFile`` (`#831`_, `#833`_)\n\n.. _#831: https://github.com/jschneier/django-storages/issues/831\n.. _#833: https://github.com/jschneier/django-storages/pull/833\n\n1.9 (2020-02-02)\n****************\n\nGeneral\n-------\n\n- **Breaking**: The long deprecated S3 backend based on ``boto`` has been removed. (`#825`_)\n- Test against and support Python 3.8 (`#810`_)\n\nS3\n--\n\n- **Deprecated**: Automatic bucket creation will be removed in version 1.10 (`#826`_)\n- **Deprecated**: The undocumented ``AWS_PRELOAD_METADATA`` and associated functionality will\n  be removed in version 1.10 (`#829`_)\n- **Deprecated**: Support for ``AWS_REDUCED_REDUNDANCY`` will be removed in version 1.10\n  Replace with ``StorageClass=REDUCED_REDUNDANCY`` in ``AWS_S3_OBJECT_PARAMETERS`` (`#829`_)\n- **Deprecated**: Support for ``AWS_S3_ENCRYPTION`` will be removed in version 1.10 (`#829`_)\n  Replace with ``ServerSideEncryption=AES256`` in ``AWS_S3_OBJECT_PARAMETERS``\n- A custom ``ContentEncoding`` is no longer overwritten automatically (note that specifying\n  one will disable automatic ``gzip``) (`#391`_, `#828`_).\n- Add ``S3Boto3Storage.get_object_parameters``, an overridable method for customizing\n  upload parameters on a per-object basis (`#819`_, `#828`_)\n- Opening and closing a file in `w` mode without writing anything will now create an empty file\n  in S3, this mimics the builtin ``open`` and Django's own ``FileSystemStorage`` (`#435`_, `#816`_)\n- Fix reading a file in text mode (`#404`_, `#827`_)\n\nGoogle Cloud\n------------\n\n- **Deprecated**: Automatic bucket creation will be removed in version 1.10 (`#826`_)\n\nDropbox\n-------\n\n- Fix crash on ``DropBoxStorage.listdir`` (`#762`_)\n- Settings can now additionally be specified at the class level to ease subclassing (`#745`_)\n\nLibcloud\n--------\n\n- Add support for Backblaze B2 to ``LibCloudStorage.url`` (`#807`_)\n\nFTP\n---\n\n- Fix creating multiple intermediary directories on Windows (`#823`_, `#824`_)\n\n.. _#825: https://github.com/jschneier/django-storages/pull/825\n.. _#826: https://github.com/jschneier/django-storages/pull/826\n.. _#829: https://github.com/jschneier/django-storages/pull/829\n.. _#391: https://github.com/jschneier/django-storages/issues/391\n.. _#828: https://github.com/jschneier/django-storages/pull/828\n.. _#819: https://github.com/jschneier/django-storages/issues/819\n.. _#810: https://github.com/jschneier/django-storages/pull/810\n.. _#435: https://github.com/jschneier/django-storages/issues/435\n.. _#816: https://github.com/jschneier/django-storages/pull/816\n.. _#404: https://github.com/jschneier/django-storages/issues/404\n.. _#827: https://github.com/jschneier/django-storages/pull/827\n.. _#762: https://github.com/jschneier/django-storages/pull/762\n.. _#745: https://github.com/jschneier/django-storages/pull/745\n.. _#807: https://github.com/jschneier/django-storages/pull/807\n.. _#823: https://github.com/jschneier/django-storages/issues/823\n.. _#824: https://github.com/jschneier/django-storages/pull/824\n\n\n1.8 (2019-11-20)\n****************\n\nGeneral\n-------\n- Add support for Django 3.0 (`#759`_)\n- Update license identifier to unambiguous ``BSD-3-Clause``\n\nS3\n--\n\n- Include error message raised when missing library is imported (`#776`_, `#793`_)\n\nGoogle\n------\n\n- **Breaking** The minimum supported version of ``google-cloud-storage`` is now ``1.15.0`` which enables...\n- Add setting ``GS_CUSTOM_ENDPOINT`` to allow usage of custom domains (`#775`_, `#648`_)\n\nAzure\n-----\n\n- Fix extra installation by pinning version to < 12 (`#785`_)\n- Add support for setting ``AZURE_CACHE_CONTROL`` header (`#780`_, `#674`_)\n\n.. _#759: https://github.com/jschneier/django-storages/pull/759\n.. _#776: https://github.com/jschneier/django-storages/issues/776\n.. _#793: https://github.com/jschneier/django-storages/pull/793\n.. _#775: https://github.com/jschneier/django-storages/issues/775\n.. _#648: https://github.com/jschneier/django-storages/pull/648\n.. _#785: https://github.com/jschneier/django-storages/pull/785\n.. _#780: https://github.com/jschneier/django-storages/pull/780\n.. _#674: https://github.com/jschneier/django-storages/issues/674\n\n\n1.7.2 (2019-09-10)\n******************\n\nS3\n--\n\n- Avoid misleading ``AWS_DEFAULT_ACL`` warning for insecure ``default_acl`` when\n  overridden as a class variable (`#591`_)\n- Propagate file deletion to cache when ``preload_metadata`` is ``True``,\n  (not the default) (`#743`_, `#749`_)\n- Fix exception raised on closed file (common if using ``ManifestFilesMixin`` or\n  ``collectstatic``. (`#382`_, `#754`_)\n\nAzure\n-----\n\n- Pare down the required packages in ``extra_requires`` when installing the ``azure`` extra to only\n  ``azure-storage-blob`` (`#680`_, `#684`_)\n- Fix compatibility with ``generate_blob_shared_access_signature`` updated signature (`#705`_, `#723`_)\n- Fetching a file now uses the configured timeout rather than hardcoding one (`#727`_)\n- Add support for configuring all blobservice options: ``AZURE_ENDPOINT_SUFFIX``,\n  ``AZURE_CUSTOM_DOMAIN``, ``AZURE_CONNECTION_STRING``, ``AZURE_TOKEN_CREDENTIAL``.\n  See the docs for more info. Huge thanks once again to @nitely. (`#750`_)\n- Fix filename handling to not strip special characters (`#609`_, `#752`_)\n\n\nGoogle Cloud\n------------\n\n- Set the file acl in the same call that uploads it (`#698`_)\n- Reduce the number of queries and required permissions when ``GS_AUTO_CREATE_BUCKET`` is\n  ``False`` (the default) (`#412`_, `#718`_)\n- Set the ``predefined_acl`` when creating a ``GoogleCloudFile`` using ``.write``\n  (`#640`_, `#756`_)\n- Add ``GS_BLOB_CHUNK_SIZE`` setting to enable efficient uploading of large files (`#757`_)\n\nDropbox\n-------\n\n- Complete migration to v2 api with file fetching and metadata fixes (`#724`_)\n- Add ``DROPBOX_TIMEOUT`` to configure client timeout defaulting to 100 seconds\n  to match the underlying sdk. (`#419`_, `#747`_)\n\nSFTP\n----\n\n- Fix reopening a file (`#746`_)\n\n.. _#591: https://github.com/jschneier/django-storages/pull/591\n.. _#680: https://github.com/jschneier/django-storages/issues/680\n.. _#684: https://github.com/jschneier/django-storages/pull/684\n.. _#698: https://github.com/jschneier/django-storages/pull/698\n.. _#705: https://github.com/jschneier/django-storages/issues/705\n.. _#723: https://github.com/jschneier/django-storages/pull/723\n.. _#727: https://github.com/jschneier/django-storages/pull/727\n.. _#746: https://github.com/jschneier/django-storages/pull/746\n.. _#724: https://github.com/jschneier/django-storages/pull/724\n.. _#412: https://github.com/jschneier/django-storages/pull/412\n.. _#718: https://github.com/jschneier/django-storages/pull/718\n.. _#743: https://github.com/jschneier/django-storages/issues/743\n.. _#749: https://github.com/jschneier/django-storages/pull/749\n.. _#750: https://github.com/jschneier/django-storages/pull/750\n.. _#609: https://github.com/jschneier/django-storages/issues/609\n.. _#752: https://github.com/jschneier/django-storages/pull/752\n.. _#382: https://github.com/jschneier/django-storages/issues/382\n.. _#754: https://github.com/jschneier/django-storages/pull/754\n.. _#419: https://github.com/jschneier/django-storages/issues/419\n.. _#747: https://github.com/jschneier/django-storages/pull/747\n.. _#640: https://github.com/jschneier/django-storages/issues/640\n.. _#756: https://github.com/jschneier/django-storages/pull/756\n.. _#757: https://github.com/jschneier/django-storages/pull/757\n\n1.7.1 (2018-09-06)\n******************\n\n- Fix off-by-1 error in ``get_available_name`` whenever ``file_overwrite`` or ``overwrite_files`` is ``True`` (`#588`_, `#589`_)\n- Change ``S3Boto3Storage.listdir()`` to use ``list_objects`` instead of ``list_objects_v2`` to restore\n  compatibility with services implementing the S3 protocol that do not yet support the new method (`#586`_, `#590`_)\n\n.. _#588: https://github.com/jschneier/django-storages/issues/588\n.. _#589: https://github.com/jschneier/django-storages/pull/589\n.. _#586: https://github.com/jschneier/django-storages/issues/586\n.. _#590: https://github.com/jschneier/django-storages/pull/590\n\n1.7 (2018-09-03)\n****************\n\n**Security**\n\n- The ``S3BotoStorage`` and ``S3Boto3Storage`` backends have an insecure\n  default ACL of ``public-read``. It is recommended that all current users audit their bucket\n  permissions.  Support has been added for setting ``AWS_DEFAULT_ACL = None`` and ``AWS_BUCKET_ACL =\n  None`` which causes all created files to inherit the bucket's ACL (and created buckets to inherit the\n  Amazon account's default ACL). This will become the default in version 1.10 (for ``S3Boto3Storage`` only\n  since ``S3BotoStorage`` will be removed in version 1.9, see below). Additionally, a warning is now\n  raised if ``AWS_DEFAULT_ACL`` or ``AWS_BUCKET_ACL`` is not explicitly set. (`#381`_, `#535`_, `#579`_)\n\n**Breaking**\n\n- The ``AzureStorage`` backend and documentation has been completely rewritten. It now\n  depends on ``azure`` and ``azure-storage-blob`` and is *vastly* improved. Big thanks to @nitely and all\n  other contributors along the way (`#565`_)\n- The ``.url()`` method of ``GoogleCloudStorage`` has been completely reworked. Many use\n  cases should require no changes and will experience a massive speedup. The ``.url()`` method no longer hits\n  the network for public urls and generates signed urls (with a default of 1-day expiration, configurable\n  via ``GS_EXPIRATION``) for non-public buckets.  Check out the docs for more information. (`#570`_)\n- Various backends will now raise ``ImproperlyConfigured`` at runtime if their\n  location (``GS_LOCATION``, ``AWS_LOCATION``) begins with a leading ``/`` rather than silently\n  stripping it.  Verify yours does not. (`#520`_)\n- The long deprecated ``GSBotoStorage`` backend is removed. (`#518`_)\n\n**Deprecation**\n\n- The insecure default of ``public-read`` for ``AWS_DEFAULT_ACL`` and\n  ``AWS_BUCKET_ACL`` in ``S3Boto3Storage`` will change to inherit the bucket's setting in version 1.10 (`#579`_)\n- The legacy ``S3BotoBackend`` is deprecated and will be removed in version 1.9.\n  It is strongly recommended to move to the ``S3Boto3Storage`` backend for performance,\n  stability and bugfix reasons. See the `boto migration docs`_ for step-by-step guidelines. (`#578`_, `#584`_)\n- The long aliased arguments to ``S3Boto3Storage`` of ``acl`` and ``bucket`` are\n  deprecated in favor of ``bucket_name`` and ``default_acl`` (`#516`_)\n- The minimum required version of ``boto3`` will be increasing to ``1.4.4`` in\n  the next major version of ``django-storages``. (`#583`_)\n\n**Features**\n\n- Add support for a file to inherit its bucket's ACL by setting ``AWS_DEFAULT_ACL = None`` (`#535`_)\n- Add ``GS_CACHE_CONTROL`` setting for ``GoogleCloudStorage`` backend (`#411`_, `#505`_)\n- Add documentation around using django-storages with Digital Ocean Spaces (`#521`_)\n- Add support for Django 2.1 and Python 3.7 (`#530`_)\n- Make ``S3Boto3Storage`` pickleable (`#551`_)\n- Add automatic reconnection to ``SFTPStorage`` (`#563`_, `#564`_)\n- Unconditionally set the security token in the boto backends (`b13efd`_)\n- Improve efficiency of ``.listdir`` on ``S3Boto3Storage`` (`#352`_)\n- Add ``AWS_S3_VERIFY`` to support custom certificates and disabling certificate verification\n  to ``S3Boto3Storage`` (`#486`_, `#580`_)\n- Add ``AWS_S3_PROXIES`` setting to ``S3Boto3Storage`` (`#583`_)\n- Add a snazzy new logo. Big thanks to @reallinfo\n\n**Bugfixes**\n\n- Reset file read offset before passing to ``GoogleCloudStorage`` and ``AzureStorage`` (`#481`_, `#581`_, `#582`_)\n- Fix various issues with multipart uploads in the S3 backends\n  (`#169`_, `#160`_, `#364`_, `#449`_, `#504`_, `#506`_, `#546`_)\n- Fix ``S3Boto3Storage`` to stream down large files (also disallow `r+w` mode) (`#383`_, `#548`_)\n- Fix ``SFTPStorageFile`` to align with the core ``File`` abstraction (`#487`_, `#568`_)\n- Catch ``IOError`` in ``SFTPStorage.delete`` (`#568`_)\n- ``AzureStorage``, ``GoogleCloudStorage``, ``S3Boto3Storage`` and ``S3BotoStorage`` now\n  respect ``max_length`` when ``file_overwrite = True`` (`#513`_, `#554`_)\n- The S3 backends now consistently use ``compresslevel=9`` (the Python stdlib default)\n  for gzipped content (`#572`_, `#576`_)\n- Improve error message of ``S3Boto3Storage`` during an unexpected exception when automatically\n  creating a bucket (`#574`_, `#577`_)\n\n.. _#381: https://github.com/jschneier/django-storages/issues/381\n.. _#535: https://github.com/jschneier/django-storages/pull/535\n.. _#579: https://github.com/jschneier/django-storages/pull/579\n.. _#565: https://github.com/jschneier/django-storages/pull/565\n.. _#520: https://github.com/jschneier/django-storages/pull/520\n.. _#518: https://github.com/jschneier/django-storages/pull/518\n.. _#516: https://github.com/jschneier/django-storages/pull/516\n.. _#481: https://github.com/jschneier/django-storages/pull/481\n.. _#581: https://github.com/jschneier/django-storages/pull/581\n.. _#582: https://github.com/jschneier/django-storages/pull/582\n.. _#411: https://github.com/jschneier/django-storages/issues/411\n.. _#505: https://github.com/jschneier/django-storages/pull/505\n.. _#521: https://github.com/jschneier/django-storages/pull/521\n.. _#169: https://github.com/jschneier/django-storages/pull/169\n.. _#160: https://github.com/jschneier/django-storages/issues/160\n.. _#364: https://github.com/jschneier/django-storages/pull/364\n.. _#449: https://github.com/jschneier/django-storages/issues/449\n.. _#504: https://github.com/jschneier/django-storages/pull/504\n.. _#530: https://github.com/jschneier/django-storages/pull/530\n.. _#506: https://github.com/jschneier/django-storages/pull/506\n.. _#546: https://github.com/jschneier/django-storages/pull/546\n.. _#383: https://github.com/jschneier/django-storages/issues/383\n.. _#548: https://github.com/jschneier/django-storages/pull/548\n.. _b13efd: https://github.com/jschneier/django-storages/commit/b13efd92b3bf3e9967b8e7819224bfcf9abb977e\n.. _#551: https://github.com/jschneier/django-storages/pull/551\n.. _#563: https://github.com/jschneier/django-storages/issues/563\n.. _#564: https://github.com/jschneier/django-storages/pull/564\n.. _#487: https://github.com/jschneier/django-storages/issues/487\n.. _#568: https://github.com/jschneier/django-storages/pull/568\n.. _#513: https://github.com/jschneier/django-storages/issues/513\n.. _#554: https://github.com/jschneier/django-storages/pull/554\n.. _#570: https://github.com/jschneier/django-storages/pull/570\n.. _#572: https://github.com/jschneier/django-storages/issues/572\n.. _#576: https://github.com/jschneier/django-storages/pull/576\n.. _#352: https://github.com/jschneier/django-storages/pull/352\n.. _#574: https://github.com/jschneier/django-storages/issues/574\n.. _#577: https://github.com/jschneier/django-storages/pull/577\n.. _#486: https://github.com/jschneier/django-storages/pull/486\n.. _#580: https://github.com/jschneier/django-storages/pull/580\n.. _#583: https://github.com/jschneier/django-storages/pull/583\n.. _boto migration docs:  https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#migrating-boto-to-boto3\n.. _#578: https://github.com/jschneier/django-storages/pull/578\n.. _#584: https://github.com/jschneier/django-storages/pull/584\n\n1.6.6 (2018-03-26)\n******************\n\n* You can now specify the backend you are using to install the necessary dependencies using\n  ``extra_requires``. For example ``pip install django-storages[boto3]`` (`#417`_)\n* Add additional content-type detection fallbacks (`#406`_, `#407`_)\n* Add ``GS_LOCATION`` setting to specify subdirectory for ``GoogleCloudStorage`` (`#355`_)\n* Add support for uploading large files to ``DropBoxStorage``, fix saving files (`#379`_, `#378`_, `#301`_)\n* Drop support for Django 1.8 and Django 1.10 (and hence Python 3.3) (`#438`_)\n* Implement ``get_created_time`` for ``GoogleCloudStorage`` (`#464`_)\n\n.. _#417: https://github.com/jschneier/django-storages/pull/417\n.. _#407: https://github.com/jschneier/django-storages/pull/407\n.. _#406: https://github.com/jschneier/django-storages/issues/406\n.. _#355: https://github.com/jschneier/django-storages/pull/355\n.. _#379: https://github.com/jschneier/django-storages/pull/379\n.. _#378: https://github.com/jschneier/django-storages/issues/378\n.. _#301: https://github.com/jschneier/django-storages/issues/301\n.. _#438: https://github.com/jschneier/django-storages/issues/438\n.. _#464: https://github.com/jschneier/django-storages/pull/464\n\n1.6.5 (2017-08-01)\n******************\n\n* Fix Django 1.11 regression with gzipped content being saved twice\n  resulting in empty files (`#367`_, `#371`_, `#373`_)\n* Fix the ``mtime`` when gzipping content on ``S3Boto3Storage`` (`#374`_)\n\n.. _#367: https://github.com/jschneier/django-storages/issues/367\n.. _#371: https://github.com/jschneier/django-storages/pull/371\n.. _#373: https://github.com/jschneier/django-storages/pull/373\n.. _#374: https://github.com/jschneier/django-storages/pull/374\n\n1.6.4 (2017-07-27)\n******************\n\n* Files uploaded with ``GoogleCloudStorage`` will now set their appropriate mimetype (`#320`_)\n* Fix ``DropBoxStorage.url`` to work. (`#357`_)\n* Fix ``S3Boto3Storage`` when ``AWS_PRELOAD_METADATA = True`` (`#366`_)\n* Fix ``S3Boto3Storage`` uploading file-like objects without names (`#195`_, `#368`_)\n* ``S3Boto3Storage`` is now threadsafe - a separate session is created on a\n  per-thread basis (`#268`_, `#358`_)\n\n.. _#320: https://github.com/jschneier/django-storages/pull/320\n.. _#357: https://github.com/jschneier/django-storages/pull/357\n.. _#366: https://github.com/jschneier/django-storages/pull/366\n.. _#195: https://github.com/jschneier/django-storages/pull/195\n.. _#368: https://github.com/jschneier/django-storages/pull/368\n.. _#268: https://github.com/jschneier/django-storages/issues/268\n.. _#358: https://github.com/jschneier/django-storages/pull/358\n\n1.6.3 (2017-06-23)\n******************\n\n* Revert default ``AWS_S3_SIGNATURE_VERSION`` to V2 to restore backwards\n  compatibility in ``S3Boto3``. It's recommended that all new projects set\n  this to be ``'s3v4'``. (`#344`_)\n\n.. _#344: https://github.com/jschneier/django-storages/pull/344\n\n1.6.2 (2017-06-22)\n******************\n\n* Fix regression in ``safe_join()`` to handle a trailing slash in an\n  intermediate path. (`#341`_)\n* Fix regression in ``gs.GSBotoStorage`` getting an unexpected kwarg.\n  (`#342`_)\n\n.. _#341: https://github.com/jschneier/django-storages/pull/341\n.. _#342: https://github.com/jschneier/django-storages/pull/342\n\n1.6.1 (2017-06-22)\n******************\n\n* Drop support for Django 1.9 (`e89db45`_)\n* Fix regression in ``safe_join()`` to allow joining a base path with an empty\n  string. (`#336`_)\n\n.. _e89db45: https://github.com/jschneier/django-storages/commit/e89db451d7e617638b5991e31df4c8de196546a6\n.. _#336: https://github.com/jschneier/django-storages/pull/336\n\n1.6 (2017-06-21)\n******************\n\n* **Breaking:** Remove backends deprecated in v1.5.1 (`#280`_)\n* **Breaking:** ``DropBoxStorage`` has been upgrade to support v2 of the API, v1 will be shut off at the\n  end of the month - upgrading is recommended (`#273`_)\n* **Breaking:** The ``SFTPStorage`` backend now checks for the existence of the fallback ``~/.ssh/known_hosts``\n  before attempting to load it.  If you had previously been passing in a path to a non-existent file it will no longer\n  attempt to load the fallback. (`#118`_, `#325`_)\n* **Breaking:** The default version value for ``AWS_S3_SIGNATURE_VERSION`` is now ``'s3v4'``. No changes should\n  be required (`#335`_)\n* **Deprecation:** The undocumented ``gs.GSBotoStorage`` backend. See the new ``gcloud.GoogleCloudStorage``\n  or ``apache_libcloud.LibCloudStorage`` backends instead. (`#236`_)\n* Add a new backend, ``gcloud.GoogleCloudStorage`` based on the ``google-cloud`` bindings. (`#236`_)\n* Pass in the location constraint when auto creating a bucket in ``S3Boto3Storage`` (`#257`_, `#258`_)\n* Add support for reading ``AWS_SESSION_TOKEN`` and ``AWS_SECURITY_TOKEN`` from the environment\n  to ``S3Boto3Storage`` and ``S3BotoStorage``. (`#283`_)\n* Fix Boto3 non-ascii filenames on Python 2.7 (`#216`_, `#217`_)\n* Fix ``collectstatic`` timezone handling in and add ``get_modified_time`` to ``S3BotoStorage`` (`#290`_)\n* Add support for Django 1.11 (`#295`_)\n* Add ``project`` keyword support to GCS in ``LibCloudStorage`` backend (`#269`_)\n* Files that have a guessable encoding (e.g. gzip or compress) will be uploaded with that Content-Encoding in\n  the ``s3boto3`` backend (`#263`_, `#264`_)\n* The Dropbox backend now properly translates backslashes in Windows paths into forward slashes (`e52a127`_)\n* The S3 backends now permit colons in the keys (`#248`_, `#322`_)\n\n.. _#217: https://github.com/jschneier/django-storages/pull/217\n.. _#273: https://github.com/jschneier/django-storages/pull/273\n.. _#216: https://github.com/jschneier/django-storages/issues/216\n.. _#283: https://github.com/jschneier/django-storages/pull/283\n.. _#280: https://github.com/jschneier/django-storages/pull/280\n.. _#257: https://github.com/jschneier/django-storages/issues/257\n.. _#258: https://github.com/jschneier/django-storages/pull/258\n.. _#290: https://github.com/jschneier/django-storages/pull/290\n.. _#295: https://github.com/jschneier/django-storages/pull/295\n.. _#269: https://github.com/jschneier/django-storages/pull/269\n.. _#263: https://github.com/jschneier/django-storages/issues/263\n.. _#264: https://github.com/jschneier/django-storages/pull/264\n.. _e52a127: https://github.com/jschneier/django-storages/commit/e52a127523fdd5be50bb670ccad566c5d527f3d1\n.. _#236: https://github.com/jschneier/django-storages/pull/236\n.. _#118: https://github.com/jschneier/django-storages/issues/118\n.. _#325: https://github.com/jschneier/django-storages/pull/325\n.. _#248: https://github.com/jschneier/django-storages/issues/248\n.. _#322: https://github.com/jschneier/django-storages/pull/322\n.. _#335: https://github.com/jschneier/django-storages/pull/335\n\n1.5.2 (2017-01-13)\n******************\n\n* Actually use ``SFTP_STORAGE_HOST`` in ``SFTPStorage`` backend (`#204`_)\n* Fix ``S3Boto3Storage`` to avoid race conditions in a multi-threaded WSGI environment (`#238`_)\n* Fix trying to localize a naive datetime when ``settings.USE_TZ`` is ``False`` in ``S3Boto3Storage.modified_time``.\n  (`#235`_, `#234`_)\n* Fix automatic bucket creation in ``S3Boto3Storage`` when ``AWS_AUTO_CREATE_BUCKET`` is ``True`` (`#196`_)\n* Improve the documentation for the S3 backends\n\n.. _#204: https://github.com/jschneier/django-storages/pull/204\n.. _#238: https://github.com/jschneier/django-storages/pull/238\n.. _#234: https://github.com/jschneier/django-storages/issues/234\n.. _#235: https://github.com/jschneier/django-storages/pull/235\n.. _#196: https://github.com/jschneier/django-storages/pull/196\n\n1.5.1 (2016-09-13)\n******************\n\n* **Breaking:** Drop support for Django 1.7 (`#185`_)\n* **Deprecation:** hashpath, image, overwrite, mogile, symlinkorcopy, database, mogile, couchdb.\n  See (`#202`_) to discuss maintenance going forward\n* Use a fixed ``mtime`` argument for ``GzipFile`` in ``S3BotoStorage`` and ``S3Boto3Storage`` to ensure\n  a stable output for gzipped files\n* Use ``.putfileobj`` instead of ``.put`` in ``S3Boto3Storage`` to use the transfer manager,\n  allowing files greater than 5GB to be put on S3 (`#194`_ , `#201`_)\n* Update ``S3Boto3Storage`` for Django 1.10 (`#181`_) (``get_modified_time`` and ``get_accessed_time``)\n* Fix bad kwarg name in ``S3Boto3Storage`` when `AWS_PRELOAD_METADATA` is `True` (`#189`_, `#190`_)\n\n.. _#202: https://github.com/jschneier/django-storages/issues/202\n.. _#201: https://github.com/jschneier/django-storages/pull/201\n.. _#194: https://github.com/jschneier/django-storages/issues/194\n.. _#190: https://github.com/jschneier/django-storages/pull/190\n.. _#189: https://github.com/jschneier/django-storages/issues/189\n.. _#185: https://github.com/jschneier/django-storages/pull/185\n.. _#181: https://github.com/jschneier/django-storages/pull/181\n\n1.5.0 (2016-08-02)\n******************\n\n* Add new backend ``S3Boto3Storage`` (`#179`_)\n* Add a `strict` option to `utils.setting` (`#176`_)\n* Tests, documentation, fixing ``.close`` for ``SFTPStorage`` (`#177`_)\n* Tests, documentation, add `.readlines` for ``FTPStorage`` (`#175`_)\n* Tests and documentation for ``DropBoxStorage`` (`#174`_)\n* Fix ``MANIFEST.in`` to not ship ``.pyc`` files. (`#145`_)\n* Enable CI testing of Python 3.5 and fix test failure from api change (`#171`_)\n\n.. _#145: https://github.com/jschneier/django-storages/pull/145\n.. _#171: https://github.com/jschneier/django-storages/pull/171\n.. _#174: https://github.com/jschneier/django-storages/pull/174\n.. _#175: https://github.com/jschneier/django-storages/pull/175\n.. _#177: https://github.com/jschneier/django-storages/pull/177\n.. _#176: https://github.com/jschneier/django-storages/pull/176\n.. _#179: https://github.com/jschneier/django-storages/pull/179\n\n1.4.1 (2016-04-07)\n******************\n\n* Files that have a guessable encoding (e.g. gzip or compress) will be uploaded with that Content-Encoding\n  in the ``s3boto`` backend. Compressable types such as ``application/javascript`` will still be gzipped.\n  PR `#122`_\n* Fix ``DropBoxStorage.exists`` check and add ``DropBoxStorage.url`` (`#127`_)\n* Add ``GS_HOST`` setting (with a default of ``GSConnection.DefaultHost``) to fix ``GSBotoStorage``.\n  (`#124`_, `#125`_)\n\n.. _#122: https://github.com/jschneier/django-storages/pull/122\n.. _#127: https://github.com/jschneier/django-storages/pull/127\n.. _#124: https://github.com/jschneier/django-storages/issues/124\n.. _#125: https://github.com/jschneier/django-storages/pull/125\n\n1.4 (2016-02-07)\n****************\n\n* This package is now released on PyPI as `django-storages`. Please update your requirements files to\n  `django-storages==1.4`.\n\n1.3.2 (2016-01-26)\n******************\n\n* Fix memory leak from not closing underlying temp file in ``s3boto`` backend (`#106`_)\n* Allow easily specifying a custom expiry time when generating a url for ``S3BotoStorage`` (`#96`_)\n* Check for bucket existence when the empty path ('') is passed to ``storage.exists`` in ``S3BotoStorage`` -\n  this prevents a crash when running ``collectstatic -c`` on Django 1.9.1 (`#112`_) fixed in `#116`_\n\n.. _#106: https://github.com/jschneier/django-storages/pull/106\n.. _#96: https://github.com/jschneier/django-storages/pull/96\n.. _#112: https://github.com/jschneier/django-storages/issues/112\n.. _#116: https://github.com/jschneier/django-storages/pull/116\n\n\n1.3.1 (2016-01-12)\n******************\n\n* A few Azure Storage fixes [pass the content-type to Azure, handle chunked content, fix ``url``] (`#45`__)\n* Add support for a Dropbox (``dropbox``) storage backend\n* Various fixes to the ``apache_libcloud`` backend [return the number of bytes asked for by ``.read``, make ``.name`` non-private, don't\n  initialize to an empty ``BytesIO`` object] (`#55`_)\n* Fix multi-part uploads in ``s3boto`` backend not respecting ``AWS_S3_ENCRYPTION`` (`#94`_)\n* Automatically gzip svg files (`#100`_)\n\n.. __: https://github.com/jschneier/django-storages/pull/45\n.. _#76: https://github.com/jschneier/django-storages/pull/76\n.. _#55: https://github.com/jschneier/django-storages/pull/55\n.. _#94: https://github.com/jschneier/django-storages/pull/94\n.. _#100: https://github.com/jschneier/django-storages/pull/100\n\n\n1.3 (2015-08-14)\n****************\n\n* **Breaking:** Drop Support for Django 1.5 and Python 2.6\n* **Breaking:** Remove previously deprecated mongodb backend\n* **Breaking:** Remove previously deprecated ``parse_ts_extended`` from s3boto storage\n* Add support for Django 1.8+ (`#36`__)\n* Add ``AWS_S3_PROXY_HOST`` and ``AWS_S3_PROXY_PORT`` settings for s3boto backend (`#41`_)\n* Fix Python3K compat issue in apache_libcloud (`#52`_)\n* Fix Google Storage backend not respecting ``GS_IS_GZIPPED`` setting (`#51`__, `#60`_)\n* Rename FTP ``_name`` attribute to ``name`` which is what the Django ``File`` api is expecting (`#70`_)\n* Put ``StorageMixin`` first in inheritance to maintain backwards compat with older versions of Django (`#63`_)\n\n.. __: https://github.com/jschneier/django-storages/pull/36\n.. _#41: https://github.com/jschneier/django-storages/pull/41\n.. _#52: https://github.com/jschneier/django-storages/issues/52\n.. __: https://github.com/jschneier/django-storages/pull/51\n.. _#60: https://github.com/jschneier/django-storages/pull/60\n.. _#70: https://github.com/jschneier/django-storages/pull/70\n.. _#63: https://github.com/jschneier/django-storages/pull/63\n\n\n1.2.3 (2015-03-14)\n******************\n\n* Variety of FTP backend fixes (fix ``exists``, add ``modified_time``, remove call to non-existent function) (`#26`_)\n* Apparently the year changed to 2015\n\n.. _#26: https://github.com/jschneier/django-storages/pull/26\n\n\n1.2.2 (2015-01-28)\n******************\n\n* Remove always show all warnings filter (`#21`_)\n* Release package as a wheel\n* Avoid resource warning during install (`#20`__)\n* Made ``S3BotoStorage`` deconstructible (previously only ``S3BotoStorageFile`` was deconstructible) (`#19`_)\n\n.. _#21: https://github.com/jschneier/django-storages/pull/21\n.. __: https://github.com/jschneier/django-storages/issues/20\n.. _#19: https://github.com/jschneier/django-storages/pull/19\n\n\n1.2.1 (2014-12-31)\n******************\n\n* **Deprecation:** Issue warning about ``parse_ts_extended``\n* **Deprecation:** mongodb backend - django-mongodb-engine now ships its own storage backend\n* Fix ``storage.modified_time`` crashing on new files when ``AWS_PRELOAD_METADATA=True`` (`#11`_, `#12`__, `#14`_)\n\n.. _#11: https://github.com/jschneier/django-storages/pull/11\n__ https://github.com/jschneier/django-storages/issues/12\n.. _#14: https://github.com/jschneier/django-storages/pull/14\n\n\n1.2 (2014-12-14)\n****************\n\n* **Breaking:** Remove legacy S3 storage (`#1`_)\n* **Breaking:** Remove mosso files backend (`#2`_)\n* Add text/javascript mimetype to S3BotoStorage gzip allowed defaults\n* Add support for Django 1.7 migrations in S3BotoStorage and ApacheLibCloudStorage (`#5`_, `#8`_)\n* Python3K (3.3+) now available for S3Boto backend (`#4`_)\n\n.. _#8: https://github.com/jschneier/django-storages/pull/8\n.. _#5: https://github.com/jschneier/django-storages/pull/5\n.. _#4: https://github.com/jschneier/django-storages/pull/4\n.. _#1: https://github.com/jschneier/django-storages/issues/1\n.. _#2: https://github.com/jschneier/django-storages/issues/2\n\n\n**NOTE**: Version 1.1.9 is the first release of django-storages after the fork.\nIt represents the current (2014-12-08) state of the original django-storages in\nmaster with no additional changes. This is the first release of the code base\nsince March 2013.\n\n1.1.9 (2014-12-08)\n******************\n\n* Fix syntax for Python3 with pull-request `#91`_\n* Support pushing content type from File object to GridFS with pull-request `#90`_\n* Support passing a region to the libcloud driver with pull-request `#86`_\n* Handle trailing slash paths fixes `#188`_ fixed by pull-request `#85`_\n* Use a SpooledTemporaryFile to conserve memory in S3BotoFile pull-request `#69`_\n* Guess content-type for S3BotoStorageFile the same way that _save() in S3BotoStorage does\n* Pass headers and response_headers through from url to generate_url in S3BotoStorage pull-request `#65`_\n* Added AWS_S3_HOST, AWS_S3_PORT and AWS_S3_USE_SSL settings to specify host, port and is_secure in pull-request `#66`_\n\n.. _#91: https://bitbucket.org/david/django-storages/pull-request/91/\n.. _#90: https://bitbucket.org/david/django-storages/pull-request/90/\n.. _#86: https://bitbucket.org/david/django-storages/pull-request/86/\n.. _#188: https://bitbucket.org/david/django-storages/issue/188/s3boto-_clean_name-is-broken-and-leads-to\n.. _#85: https://bitbucket.org/david/django-storages/pull-request/85/\n.. _#69: https://bitbucket.org/david/django-storages/pull-request/69/\n.. _#66: https://bitbucket.org/david/django-storages/pull-request/66/\n.. _#65: https://bitbucket.org/david/django-storages/pull-request/65/\n\n\n**Everything Below Here Was Previously Released on PyPI under django-storages**\n\n\n1.1.8 (2013-03-31)\n******************\n\n* Fixes `#156`_ regarding date parsing, ValueError when running collectstatic\n* Proper handling of boto dev version parsing\n* Made SFTP URLs accessible, now uses settings.MEDIA_URL instead of sftp://\n\n.. _#156: https://bitbucket.org/david/django-storages/issue/156/s3boto-backend-valueerror-time-data-thu-07\n\n1.1.7 (2013-03-20)\n******************\n\n* Listing of huge buckets on S3 is now prevented by using the prefix argument to boto's list() method\n* Initial support for Windows Azure Storage\n* Switched to useing boto's parse_ts date parser getting last modified info when using S3boto backend\n* Fixed key handling in S3boto and Google Storage backends\n* Account for lack of multipart upload in Google Storage backend\n* Fixed seek() issue when using AWS_IS_GZIPPED by darkness51 with pull-request `#50`_\n* Improvements to S3BotoStorage and GSBotoStorage\n\n.. _#50: https://bitbucket.org/david/django-storages/pull-request/50/\n\n1.1.6 (2013-01-06)\n******************\n\n* Merged many changes from Jannis Leidel (mostly regarding gzipping)\n* Fixed tests by Ian Lewis\n* Added support for Google Cloud Storage backend by Jannis Leidel\n* Updated license file by Dan Loewenherz, fixes `#133`_ with pull-request `#44`_\n* Set Content-Type header for use in upload_part_from_file by Gerardo Curiel\n* Pass the rewind parameter to Boto's set_contents_from_file method by Jannis Leidel with pull-request `#45`_\n* Fix for FTPStorageFile close() method by Mathieu Comandon with pull-request `#43`_\n* Minor refactoring by Oktay Sancak with pull-request `#48`_\n* Ungzip on download based on Content-Encoding by Gavin Wahl with pull-request `#46`_\n* Add support for S3 server-side encryption by Tobias McNulty with pull-request `#17`_\n* Add an optional setting to the boto storage to produce protocol-relative URLs, fixes `#105`_\n\n.. _#133: https://bitbucket.org/david/django-storages/issue/133/license-file-refers-to-incorrect-project\n.. _#44: https://bitbucket.org/david/django-storages/pull-request/44/\n.. _#45: https://bitbucket.org/david/django-storages/pull-request/45/\n.. _#43: https://bitbucket.org/david/django-storages/pull-request/43/\n.. _#48: https://bitbucket.org/david/django-storages/pull-request/48/\n.. _#46: https://bitbucket.org/david/django-storages/pull-request/46/\n.. _#17: https://bitbucket.org/david/django-storages/pull-request/17/\n.. _#105: https://bitbucket.org/david/django-storages/issue/105/add-option-to-produce-protocol-relative\n\n\n1.1.5 (2012-07-18)\n******************\n\n* Merged pull request `#36`_ from freakboy3742 Keith-Magee, improvements to Apache Libcloud backend and docs\n* Merged pull request `#35`_ from atodorov, allows more granular S3 access settings\n* Add support for SSL in Rackspace Cloudfiles backend\n* Fixed the listdir() method in s3boto backend, fixes `#57`_\n* Added base url tests for safe_join in s3boto backend\n* Merged pull request `#20`_ from alanjds, fixed SuspiciousOperation warning if AWS_LOCATION ends with '/'\n* Added FILE_BUFFER_SIZE setting to s3boto backend\n* Merged pull request `#30`_ from pendletongp, resolves `#108`_, `#109`_ and `#110`_\n* Updated the modified_time() method so that it doesn't require dateutil. fixes `#111`_\n* Merged pull request `#16`_ from chamal, adds Apache Libcloud backend\n* When preloading the S3 metadata make sure we reset the files key during saving to prevent stale metadata\n* Merged pull request `#24`_ from tobias.mcnulty, fixes bug where s3boto backend returns modified_time in wrong time zone\n* Fixed HashPathStorage.location to no longer use settings.MEDIA_ROOT\n* Remove download_url from setup file so PyPI dist is used\n\n.. _#36: https://bitbucket.org/david/django-storages/pull-request/36/\n.. _#35: https://bitbucket.org/david/django-storages/pull-request/35/\n.. _#57: https://bitbucket.org/david/django-storages/issue/57\n.. _#20: https://bitbucket.org/david/django-storages/pull-request/20/\n.. _#30: https://bitbucket.org/david/django-storages/pull-request/30/\n.. _#108: https://bitbucket.org/david/django-storages/issue/108\n.. _#109: https://bitbucket.org/david/django-storages/issue/109\n.. _#110: https://bitbucket.org/david/django-storages/issue/110\n.. _#111: https://bitbucket.org/david/django-storages/issue/111\n.. _#16: https://bitbucket.org/david/django-storages/pull-request/16/\n.. _#24: https://bitbucket.org/david/django-storages/pull-request/24/\n\n1.1.4 (2012-01-06)\n******************\n\n* Added PendingDeprecationWarning for mosso backend\n* Merged pull request `#13`_ from marcoala, adds ``SFTP_KNOWN_HOST_FILE`` setting to SFTP storage backend\n* Merged pull request `#12`_ from ryankask, fixes HashPathStorage tests that delete remote media\n* Merged pull request `#10`_ from key, adds support for django-mongodb-engine 0.4.0 or later, fixes GridFS file deletion bug\n* Fixed S3BotoStorage performance problem calling modified_time()\n* Added deprecation warning for s3 backend, refs `#40`_\n* Fixed CLOUDFILES_CONNECTION_KWARGS import error, fixes `#78`_\n* Switched to sphinx documentation, set official docs up on https://django-storages.readthedocs.io/\n* HashPathStorage uses self.exists now, fixes `#83`_\n\n.. _#13: https://bitbucket.org/david/django-storages/pull-request/13/a-version-of-sftp-storage-that-allows-you\n.. _#12: https://bitbucket.org/david/django-storages/pull-request/12/hashpathstorage-tests-deleted-my-projects\n.. _#10: https://bitbucket.org/david/django-storages/pull-request/10/support-django-mongodb-engine-040\n.. _#40: https://bitbucket.org/david/django-storages/issue/40/deprecate-s3py-backend\n.. _#78: https://bitbucket.org/david/django-storages/issue/78/import-error\n.. _#83: https://bitbucket.org/david/django-storages/issue/6/symlinkorcopystorage-new-custom-storage\n\n1.1.3 (2011-08-15)\n******************\n\n* Created this lovely change log\n* Fixed `#89`_: broken StringIO import in CloudFiles backend\n* Merged `pull request #5`_: HashPathStorage path bug\n\n.. _#89: https://bitbucket.org/david/django-storages/issue/89/112-broke-the-mosso-backend\n.. _pull request #5: https://bitbucket.org/david/django-storages/pull-request/5/fixed-path-bug-and-added-testcase-for\n",
    "bugtrack_url": null,
    "license": "BSD-3-Clause",
    "summary": "Support for many storage backends in Django",
    "version": "1.14.3",
    "project_urls": {
        "Homepage": "https://github.com/jschneier/django-storages"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "72b3f289e09be846831dea41f5133f9f228974061a6cc8b14c1228e848628d5a",
                "md5": "41a387ced5c19a6b48554b6129198551",
                "sha256": "31f263389e95ce3a1b902fb5f739a7ed32895f7d8b80179fe7453ecc0dfe102e"
            },
            "downloads": -1,
            "filename": "django_storages-1.14.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "41a387ced5c19a6b48554b6129198551",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 47861,
            "upload_time": "2024-05-04T18:57:37",
            "upload_time_iso_8601": "2024-05-04T18:57:37.255318Z",
            "url": "https://files.pythonhosted.org/packages/72/b3/f289e09be846831dea41f5133f9f228974061a6cc8b14c1228e848628d5a/django_storages-1.14.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1096eb5666d3f68f929db2ff8254279e65c55f7c323c0042d2c59f77a72df12a",
                "md5": "22dfde11829ebe2d41164d338c29a409",
                "sha256": "95a12836cd998d4c7a4512347322331c662d9114c4344f932f5e9c0fce000608"
            },
            "downloads": -1,
            "filename": "django-storages-1.14.3.tar.gz",
            "has_sig": false,
            "md5_digest": "22dfde11829ebe2d41164d338c29a409",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 115310,
            "upload_time": "2024-05-04T18:57:39",
            "upload_time_iso_8601": "2024-05-04T18:57:39.624316Z",
            "url": "https://files.pythonhosted.org/packages/10/96/eb5666d3f68f929db2ff8254279e65c55f7c323c0042d2c59f77a72df12a/django-storages-1.14.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-04 18:57:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jschneier",
    "github_project": "django-storages",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "django-storages"
}
        
Elapsed time: 0.31735s