Changelog ========= This document describes changes between past releases. For information about future releases, check `milestones`_ and :doc:`/about/vision`. 2.6.0 (unreleased) ---------------- - No changes yet 2.5.0 (2025-10-28) ---------------- - Upgrade to Django 5.2 and Python 3.14 2.4.0 (2024-08-05) ------------------ - Drop support for Python 3.6 - Escape malicious filenames - Handle headers in XAccel responses 2.3.0 (2022-01-11) ------------------ - Drop Django 3.0 support - Add Django 3.2 support - Add support for Python 3.10 - Add support for Django 4.0 - Remove support for Python 3.5 and Django 1.11 - Add support for Python 3.9 and Django 3.1 - Remove old urls syntax and adopt the new one - Move the project to the jazzband organization - Adopt black automatic formatting rules 2.1.1 (2020-01-14) ------------------ - Fix missing function parameter. (#152) 2.1 (2020-01-13) ---------------- - Add a SignedFileSystemStorage that signs file URLs for clients. (#151) 2.0 (2020-01-07) ---------------- - Drop support for Python 2.7. - Add black and isort. 1.10 (2020-01-07) ----------------- - Introduced support from Django 1.11, 2.2 and 3.0. - Drop support of Django 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 2.0 and 2.1 1.9 (2016-03-15) ---------------- - Feature #112 - Introduced support of Django 1.9. - Feature #113 - Introduced support of Python 3.5. - Feature #116 - ``HTTPFile`` has ``content_type`` property. It makes ``HTTPDownloadView`` proxy ``Content-Type`` header from remote location. 1.8 (2015-07-20) ---------------- Bugfixes. - Bugfix #103 - ``PathDownloadView.get_file()`` makes a single call to ``PathDownloadView.get_file()`` (was doing it twice). - Bugfix #104 - Pass numeric timestamp to Django's ``was_modified_since()`` (was passing a datetime). 1.7 (2015-06-13) ---------------- Bugfixes. - Bugfix #87 - Filenames with commas are now supported. In download responses, filename is now surrounded by double quotes. - Bugfix #97 - ``HTTPFile`` proxies bytes as ``BytesIteratorIO`` (was undecoded urllib3 file object). ``StringIteratorIO`` has been split into ``TextIteratorIO`` and ``BytesIteratorIO``. ``StringIteratorIO`` is deprecated but kept for backward compatibility as an alias for ``TextIteratorIO``. - Bugfix #92 - Run demo using ``make demo runserver`` (was broken). - Feature #99 - Tox runs project's tests with Python 2.7, 3.3 and 3.4, and with Django 1.5 to 1.8. - Refactoring #98 - Refreshed development environment: packaging, Tox and Sphinx. 1.6 (2014-03-03) ---------------- Python 3 support, development environment refactoring. - Feature #46: introduced support for Python>=3.3. - Feature #80: added documentation about "how to serve a file inline VS how to serve a file as attachment". Improved documentation of views' base options inherited from ``DownloadMixin``. - Feature #74: the Makefile in project's repository no longer creates a virtualenv. Developers setup the environment as they like, i.e. using virtualenv, virtualenvwrapper or whatever. Tests are run with tox. 1.5 (2013-11-29) ---------------- X-Sendfile support and helpers to migrate for `django-sendfile`. - Feature #2 - Introduced support of Lighttpd's x-Sendfile. - Feature #36 - Introduced support of Apache's mod_xsendfile. - Feature #41 - ``django_downloadview.sendfile`` is a port of `django-sendfile`'s ``sendfile`` function. The documentation contains notes about migrating from `django-sendfile` to `django-downloadview`. 1.4 (2013-11-24) ---------------- Bugfixes and documentation features. - Bugfix #43 - ``ObjectDownloadView`` returns HTTP 404 if model instance's file field is empty (was HTTP 500). - Bugfix #7 - Special characters in file names (``Content-Disposition`` header) are urlencoded. An US-ASCII fallback is also provided. - Feature #10 - `django-downloadview` is registered on djangopackages.com. - Feature #65 - INSTALL documentation shows "known good set" (KGS) of versions, i.e. versions that have been used in test environment. 1.3 (2013-11-08) ---------------- Big refactoring around middleware configuration, API readability and documentation. - Bugfix #57 - ``PathDownloadView`` opens files in binary mode (was text mode). - Bugfix #48 - Fixed ``basename`` assertion in ``assert_download_response``: checks ``Content-Disposition`` header. - Bugfix #49 - Fixed ``content`` assertion in ``assert_download_response``: checks only response's ``streaming_content`` attribute. - Bugfix #60 - ``VirtualFile.__iter__`` uses ``force_bytes()`` to support both "text-mode" and "binary-mode" content. See https://code.djangoproject.com/ticket/21321 - Feature #50 - Introduced ``django_downloadview.DownloadDispatcherMiddleware`` that iterates over a list of configurable download middlewares. Allows to plug several download middlewares with different configurations. This middleware is mostly dedicated to internal usage. It is used by ``SmartDownloadMiddleware`` described below. - Feature #42 - Documentation shows how to stream generated content (yield). Introduced ``django_downloadview.StringIteratorIO``. - Refactoring #51 - Dropped support of Python 2.6 - Refactoring #25 - Introduced ``django_downloadview.SmartDownloadMiddleware`` which allows to setup multiple optimization rules for one backend. Deprecates the following settings related to previous single-and-global middleware: * ``NGINX_DOWNLOAD_MIDDLEWARE_MEDIA_ROOT`` * ``NGINX_DOWNLOAD_MIDDLEWARE_MEDIA_URL`` * ``NGINX_DOWNLOAD_MIDDLEWARE_EXPIRES`` * ``NGINX_DOWNLOAD_MIDDLEWARE_WITH_BUFFERING`` * ``NGINX_DOWNLOAD_MIDDLEWARE_LIMIT_RATE`` - Refactoring #52 - ObjectDownloadView now inherits from SingleObjectMixin and BaseDownloadView (was DownloadMixin and BaseDetailView). Simplified DownloadMixin.render_to_response() signature. - Refactoring #40 - Documentation includes examples from demo project. - Refactoring #39 - Documentation focuses on usage, rather than API. Improved narrative documentation. - Refactoring #53 - Added base classes in ``django_downloadview.middlewares``, such as ``ProxiedDownloadMiddleware``. - Refactoring #54 - Expose most Python API directly in `django_downloadview` package. Simplifies ``import`` statements in client applications. Splitted nginx module in a package. - Added unit tests, improved code coverage. 1.2 (2013-05-28) ---------------- Bugfixes and documentation improvements. - Bugfix #26 - Prevented computation of virtual file's size, unless the file wrapper implements was_modified_since() method. - Bugfix #34 - Improved support of files that do not implement modification time. - Bugfix #35 - Fixed README conversion from reStructuredText to HTML (PyPI). 1.1 (2013-04-11) ---------------- Various improvements. Contains **backward incompatible changes.** - Added HTTPDownloadView to proxy to arbitrary URL. - Added VirtualDownloadView to support files living in memory. - Using StreamingHttpResponse introduced with Django 1.5. Makes Django 1.5 a requirement! - Added ``django_downloadview.test.assert_download_response`` utility. - Download views and response now use file wrappers. Most logic around file attributes, formerly in views, moved to wrappers. - Replaced DownloadView by PathDownloadView and StorageDownloadView. Use the right one depending on the use case. 1.0 (2012-12-04) ---------------- - Introduced optimizations for Nginx X-Accel: a middleware and a decorator - Introduced generic views: DownloadView and ObjectDownloadView - Initialized project .. rubric:: Notes & references .. target-notes:: .. _`milestones`: https://github.com/jazzband/django-downloadview/milestones