Skip to main content

A django widget library for securely uploading files directly to S3 (or MinIO).

Project description

django-s3-file-field

PyPI

django-s3-file-field is a Django library for uploading files directly to AWS S3 or MinIO Storage from HTTP clients (browsers, CLIs, etc.).

Benefits

django-s3-file-field makes long-running file transfers (with large files or slow connections) more efficient, as the file content is no longer proxied through the Django server. This also frees Django from needing to maintain active HTTP requests during file upload, decreasing server load and facilitating deployment to environments like Heroku, which have short, strict request timeouts.

Scope

The principal API of django-s3-file-field is the S3FileField, which is a subclass of Django's FileField. django-s3-file-field does not affect any operations other than uploading from external HTTP clients; for all other file operations (downloading, uploading from the Python API, etc.), refer to Django's file management documentation.

django-s3-file-field supports both the creation and modification (by overwrite) of S3FileField-containing Model instances. It supports server-rendered views, via the Forms API, with Form Field and Widget subclasses which will automatically be used for ModelForm instances. It also supports RESTful APIs, via Django Rest Framework's Serializer API, with a Serializer Field subclass which will automatically be used for ModelSerializer instances.

Installation

django-s3-file-field must be used with a compatible Django Storage, which are:

After the appropriate Storage is installed and configured, install django-s3-file-field, using the corresponding extra:

pip install django-s3-file-field[boto3]

or

pip install django-s3-file-field[minio]

Enable django-s3-file-field as an installed Django app:

# settings.py
INSTALLED_APPS = [
    ...,
    's3_file_field',
]

Add django-s3-file-field's URLconf to the root URLconf; the path prefix ('api/s3-upload/') can be changed arbitrarily as desired:

# urls.py
from django.urls import include, path

urlpatterns = [
    ...,
    path('api/s3-upload/', include('s3_file_field.urls')),
]

Usage

For all usage, define an S3FileField on a Django Model, instead of a FileField:

from django.db import models
from s3_file_field import S3FileField

class Resource(models.Model):
    blob = S3FileField()

Django Forms

When defining a Django ModelForm, the appropriate Form Field will be automatically used:

from django.forms import ModelForm
from .models import Resource

class ResourceForm(ModelForm):
    class Meta:
        model = Resource
        fields = ['blob']

Forms using django-s3-file-field include additional assets, which it's essential to render along with the Form. Typically, this can be done in any Form-containing Template as:

<head>
  {# Assuming the Form is availible in context as "form" #}
  {{ form.media }}
</head>

Django Rest Framework

When defining a Django Rest Frameowrk ModelSerializer, the appropriate Serializer Field will be automatically used:

from rest_framework import serializers
from .models import Resource

class ResourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Resource
        fields = ['blob']

Clients interacting with these RESTful APIs will need to use a corresponding django-s3-file-field client library. Client libraries (and associated documentation) are available for:

Pytest

When installed, django-s3-file-field makes several Pytest fixtures automatically available for use.

The s3ff_field_value fixture will return a valid input value for Django ModelForm or Django Rest Framework ModelSerializer subclasses:

from .forms import ResourceForm

def test_resource_form(s3ff_field_value):
    form = ResourceForm(data={'blob': s3ff_field_value})
    assert form.is_valid()

Alternatively, the s3ff_field_value_factory fixture transforms a File object into a valid input value (for Django ModelForm or Django Rest Framework ModelSerializer subclasses), providing more control over the uploaded file:

from django.core.files.storage import default_storage
from rest_framework.test import APIClient

def test_resource_create(s3ff_field_value_factory):
    client = APIClient()
    stored_file = default_storage.open('some_existing_file.txt')
    s3ff_field_value = s3ff_field_value_factory(stored_file)
    resp = client.post('/resource', data={'blob': s3ff_field_value})
    assert resp.status_code == 201

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-s3-file-field-0.2.0.tar.gz (135.3 kB view details)

Uploaded Source

Built Distribution

django_s3_file_field-0.2.0-py3-none-any.whl (32.0 kB view details)

Uploaded Python 3

File details

Details for the file django-s3-file-field-0.2.0.tar.gz.

File metadata

  • Download URL: django-s3-file-field-0.2.0.tar.gz
  • Upload date:
  • Size: 135.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for django-s3-file-field-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8d0441234d54ba2d4915c421a0e722d153dda5301bc03b812c33861c08f5dbe7
MD5 a39d9b0da76b11dcf95a7f9c4eeaee37
BLAKE2b-256 3d6a1468c0bc3716575ae843b31f356b33e06febccae6cf97be4d38b3e638b75

See more details on using hashes here.

File details

Details for the file django_s3_file_field-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: django_s3_file_field-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 32.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for django_s3_file_field-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 af011437bd923b66f5df83b6554271aa05b81d0d07448adc4e82dbbc9cab680b
MD5 12dca4eab0aaef35916eb959b9f465e3
BLAKE2b-256 dd78d92b3558c9d3a06b3b1d2c48852e6c33b4e134ebbc55b7ef67fc389b5243

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page