PathDownloadView¶
PathDownloadView
serves file given a path on local filesystem.
Use this view whenever you just have a path, outside storage or model.
Warning
Take care of path validation, especially if you compute paths from user input: an attacker may be able to download files from arbitrary locations. In most cases, you should consider managing files in storages, because they implement default security mechanisms.
Simple example¶
Setup a view to stream files given path:
import os
from django_downloadview import PathDownloadView
# Let's initialize some fixtures.
app_dir = os.path.dirname(os.path.abspath(__file__))
project_dir = os.path.dirname(app_dir)
fixtures_dir = os.path.join(project_dir, 'fixtures')
#: Path to a text file that says 'Hello world!'.
hello_world_path = os.path.join(fixtures_dir, 'hello-world.txt')
#: Serve ``fixtures/hello-world.txt`` file.
static_path = PathDownloadView.as_view(path=hello_world_path)
Base options¶
PathDownloadView
inherits from
DownloadMixin
, which has various
options such as basename
or attachment
.
Computing path dynamically¶
Override the PathDownloadView.get_path()
method to adapt path
resolution to your needs:
import os
from django_downloadview import PathDownloadView
# Let's initialize some fixtures.
app_dir = os.path.dirname(os.path.abspath(__file__))
project_dir = os.path.dirname(app_dir)
fixtures_dir = os.path.join(project_dir, 'fixtures')
class DynamicPathDownloadView(PathDownloadView):
"""Serve file in ``settings.MEDIA_ROOT``.
.. warning::
Make sure to prevent "../" in path via URL patterns.
.. note::
This particular setup would be easier to perform with
:class:`StorageDownloadView`
"""
def get_path(self):
"""Return path inside fixtures directory."""
# Get path from URL resolvers or as_view kwarg.
relative_path = super(DynamicPathDownloadView, self).get_path()
# Make it absolute.
absolute_path = os.path.join(fixtures_dir, relative_path)
return absolute_path
dynamic_path = DynamicPathDownloadView.as_view()
The view accepts a path
argument you can setup either in as_view
or
via URLconfs:
from django.conf.urls import patterns, url
from demoproject.path import views
urlpatterns = patterns(
'',
url(r'^dynamic-path/(?P<path>[a-zA-Z0-9_-]+\.[a-zA-Z0-9]{1,4})$',
views.dynamic_path,
name='dynamic_path'),
)
API reference¶
-
class
django_downloadview.views.path.
PathDownloadView
(**kwargs)¶ Bases:
django_downloadview.views.base.BaseDownloadView
Serve a file using filename.
-
path
= None¶ Server-side name (including path) of the file to serve.
Filename is supposed to be an absolute filename of a file located on the local filesystem.
-
path_url_kwarg
= 'path'¶ Name of the URL argument that contains path.
-
get_path
()¶ Return actual path of the file to serve.
Default implementation simply returns view’s
path
.Override this method if you want custom implementation. As an example,
path
could be relative and your customget_path()
implementation makes it absolute.
-
get_file
()¶ Use path to return wrapper around file to serve.
-