Alternatives and related projects¶
This document presents other projects that provide similar or complementary functionalities. It focuses on differences with django-downloadview.
There is a comparison grid on djangopackages.com: https://www.djangopackages.com/grids/g/file-streaming/.
Here are additional highlights...
Django’s static file view¶
django.contrib.staticfiles provides a view to serve files [1]. It is simple and quite naive by design: it is meant for development, not for production. See Django ticket #2131 [2]: advanced file streaming is left to third-party applications.
django-downloadview is such a third-party application.
django-sendfile¶
django-sendfile [3] is a wrapper around web-server specific methods for sending files to web clients.
Note
django_downloadview.shortcuts.sendfile() is a port of django-sendfile‘s main function. See Migrating from django-sendfile for details.
django-senfile‘s main focus is simplicity: API is made of a single sendfile() function you call inside your views:
from sendfile import sendfile
def hello_world(request):
"""Send 'hello-world.pdf' file as a response."""
return sendfile(request, '/path/to/hello-world.pdf')
The download response type depends on the chosen backend, which could be Django, Lighttpd’s X-Sendfile, Nginx’s X-Accel... depending your settings:
SENDFILE_BACKEND = 'sendfile.backends.nginx' # sendfile() will return
# X-Accel responses.
# Additional settings for sendfile's nginx backend.
SENDFILE_ROOT = '/path/to'
SENDFILE_URL = '/proxied-download'
Here are main differences between the two projects:
- django-sendfile supports only files that live on local filesystem (i.e. where os.path.exists returns True). Whereas django-downloadview allows you to serve or proxy files stored in various locations, including remote ones.
- django-sendfile uses a single global configuration (i.e. settings.SENDFILE_ROOT), thus optimizations are limited to a single root folder. Whereas django-downloadview‘s DownloadDispatcherMiddleware supports multiple configurations.
References
[1] | https://docs.djangoproject.com/en/1.6/ref/contrib/staticfiles/#static-file-development-view |
[2] | https://code.djangoproject.com/ticket/2131 |
[3] | http://pypi.python.org/pypi/django-sendfile |