Skip to main content

django-private-storage

This module offers a private media file storage, so user uploads can be protected behind a login.

It uses the Django storage API’s internally, so all form rendering and admin integration work out of the box.

Installation

pip install django-private-storage

Configuration

Add to the settings:

INSTALLED_APPS += (
    'private_storage',
)

PRIVATE_STORAGE_ROOT = '/path/to/private-media/'
PRIVATE_STORAGE_AUTH_FUNCTION = 'apps.utils.private_storage.permissions.allow_staff'

Add to urls.py:

import private_storage.urls

urlpatterns += [
    url('^private-media/', include(private_storage.urls)),
]

Usage

In a Django model, add the PrivateFileField:

from django.db import models
from private_storage.fields import PrivateFileField

class MyModel(models.Model):
    title = models.CharField("Title", max_length=200)
    file = PrivateFileField("File")

The PrivateFileField also accepts the following kwargs:

  • upload_to: the optional subfolder in the PRIVATE_STORAGE_ROOT.

  • upload_subfolder: a function that defines the folder, it receives the current model instance.

  • content_types: allowed content types

  • max_file_size: maximum file size.

  • storage: the storage object to use, defaults to private_storage.storage.private_storage

Other topics

Defining access rules

The PRIVATE_STORAGE_AUTH_FUNCTION defines which user may access the files. By default, this only includes superusers.

The following options are available out of the box:

  • private_storage.permissions.allow_authenticated

  • private_storage.permissions.allow_staff

  • private_storage.permissions.allow_superuser

You can create a custom function, and use that instead. The function receives a private_storate.models.PrivateFile object, which has the following fields:

  • request: the Django request.

  • storage: the storage engine used to retrieve the file.

  • relative_name: the file name in the storage.

  • full_path: the full file system path.

  • exists(): whether the file exists.

  • content_type: the HTTP content type.

Optimizing large file transfers

By default, the files are served by the Django instance. This can be inefficient, since the whole file needs to be read in chunks and passed through the WSGI buffers, OS kernel and webserver. In effect, the complete file is copied several times through memory buffers.

Hence, webservers offer a method to send the file on behalf of the backend application. This happens with the sendfile() system call, which can be enabled with the following settings:

For apache

PRIVATE_STORAGE_SERVER = 'apache'

For Nginx

PRIVATE_STORAGE_SERVER = 'nginx'
PRIVATE_STORAGE_INTERNAL_URL = '/private-x-accel-redirect/'

Add the following location block in the server config:

location /private-x-accel-redirect/ {
  internal;
  alias   /path/to/private-media/;
}

Other webservers

The PRIVATE_STORAGE_SERVER may also point to a dotted Python class path. Implement a class with a static serve(private_file) method.

Using multiple storages

The PrivateFileField accepts a storage kwarg, hence you can initialize multiple private_storage.storage.PrivateStorage objects, each providing files from a different location and base_url.

For example:

from django.db import models
from private_storage.fields import PrivateFileField
from private_storage.storage import PrivateStorage

my_storage = PrivateStorage(
    location='/path/to/storage2/',
    base_url='/private-documents2/'
)

class MyModel(models.Model):
    file = PrivateFileField(storage=my_storage)

Then create a view to serve those files:

from private_storage.views import PrivateStorageView
from .models import my_storage

class MyStorageView(PrivateStorageView):
    storage = my_storage

    def can_access_file(self, private_file):
        # This overrides PRIVATE_STORAGE_AUTH_FUNCTION
        return self.request.is_superuser

And expose that URL:

urlpatterns += [
    url(^private-documents2/(?P<path>.*)$', views.MyStorageView.as_view()),
]

Contributing

This module is designed to be generic. In case there is anything you didn’t like about it, or think it’s not flexible enough, please let us know. We’d love to improve it!

Metadata

Release files for django-private-storage 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-private-storage 1.0.2
File Size Uploaded
django-private-storage-1.0.2.tar.gz 13.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-private-storage 1.0.2
File Interpreter ABI Platform
django_private_storage-1.0.2-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 29.0 kB

Release files / django-private-storage-1.0.2.tar.gz

Download URL django-private-storage-1.0.2.tar.gz
Size 13.9 kB
Tags Source
SHA-256 checksum
How to use checksums
884cd94d2acaff3928c8dea84feaf09a400486351716715ef68d2f87bbbde8d4
BLAKE2b-256 checksum
How to use checksums
c1d169d23c33b6ba08028bd730e2435c2183d121725a9fd100004c7fd7203d61
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / django_private_storage-1.0.2-py2.py3-none-any.whl

Download URL django_private_storage-1.0.2-py2.py3-none-any.whl
Size 15.1 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
db86b6a140dcad442299f310e501187f0e2405e22afccb69225964d15b1be966
BLAKE2b-256 checksum
How to use checksums
d711aeaf4c369ebf21c3b8ce565595caee58bf149725e79d9a09f87f61d8f525
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

3.1.3

2 release files

3.1.1

2 release files

3.1

2 release files

3.0

2 release files

2.3.0

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2

2 release files

2.1.3

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.1

2 release files

2.0

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1

2 release files

This release

1.0.2 This release

2 release files

1.0.1

2 release files

1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page