Skip to main content

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[s3]

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 Framework 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: str) -> None:
    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

Metadata

Release files for django-s3-file-field 1.1.0

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-s3-file-field 1.1.0
File Size Uploaded
django_s3_file_field-1.1.0.tar.gz 36.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-s3-file-field 1.1.0
File Interpreter ABI Platform
django_s3_file_field-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 75.8 kB

Release files / django_s3_file_field-1.1.0.tar.gz

Download URL django_s3_file_field-1.1.0.tar.gz
Size 36.2 kB
Tags Source
SHA-256 checksum
How to use checksums
d3f9f9492875c6725433cc2ba21f1d8c24605eec968cbf33f7c14815388901db
BLAKE2b-256 checksum
How to use checksums
94c897674eefea66c69246a792f9b698d1a3e2a1ed37843045f27763788ef2e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 30, 2025.

Transparency log

Release files / django_s3_file_field-1.1.0-py3-none-any.whl

Download URL django_s3_file_field-1.1.0-py3-none-any.whl
Size 39.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
655957fee0fd026eacdb03e75a333a615559f2ae32441fa69070e1ce55c0061b
BLAKE2b-256 checksum
How to use checksums
fa041a5d8b6172e0e0016eabfbb7cd725e04082a1891e6f2a9ae110c54dc9fa7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 30, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.23

2 release files

0.0.22

2 release files

0.0.21

2 release files

0.0.20

2 release files

0.0.17

2 release files

0.0.15

2 release files

0.0.14

2 release files

0.0.9

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.3

2 release files

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