Name | django-s3-file-field JSON |
Version |
1.0.1
JSON |
| download |
home_page | None |
Summary | A Django library for uploading files directly to AWS S3 or MinIO Storage from HTTP clients. |
upload_time | 2024-03-22 04:32:55 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | Apache 2.0 |
keywords |
django
django-widget
minio
s3
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# django-s3-file-field
[![PyPI](https://img.shields.io/pypi/v/django-s3-file-field)](https://pypi.org/project/django-s3-file-field/)
django-s3-file-field is a Django library for uploading files directly to
[AWS S3](https://aws.amazon.com/s3/) or [MinIO](https://min.io/) 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](https://devcenter.heroku.com/articles/request-timeout).
### Scope
The principal API of django-s3-file-field is the `S3FileField`, which is a subclass of
[Django's `FileField`](https://docs.djangoproject.com/en/4.2/ref/models/fields/#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](https://docs.djangoproject.com/en/4.2/topics/files/).
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:
* `S3Storage` in [django-storages](https://django-storages.readthedocs.io/),
for [AWS S3](https://aws.amazon.com/s3/)
* `MinioStorage` or `MinioMediaStorage` in [django-minio-storage](https://django-minio-storage.readthedocs.io/),
for [MinIO](https://min.io/)
After the appropriate Storage is installed and configured, install django-s3-file-field, using the
corresponding extra:
```bash
pip install django-s3-file-field[s3]
```
or
```bash
pip install django-s3-file-field[minio]
```
Enable django-s3-file-field as an installed Django app:
```python
# 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:
```python
# 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`:
```python
from django.db import models
from s3_file_field import S3FileField
class Resource(models.Model):
blob = S3FileField()
```
### Django Forms
When defining a
[Django `ModelForm`](https://docs.djangoproject.com/en/4.2/topics/forms/modelforms/),
the appropriate Form `Field` will be automatically used:
```python
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](https://docs.djangoproject.com/en/4.2/topics/forms/media/), 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`](https://www.django-rest-framework.org/api-guide/serializers/#modelserializer),
the appropriate Serializer `Field` will be automatically used:
```python
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:
* [Python](python-client/README.md)
* [Javascript / TypeScript](javascript-client/README.md)
### Pytest
When installed, django-s3-file-field makes several
[Pytest fixtures](https://docs.pytest.org/en/latest/explanation/fixtures.html) automatically
available for use.
The `s3ff_field_value` fixture will return a valid input value for Django `ModelForm` or
Django Rest Framework `ModelSerializer` subclasses:
```python
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:
```python
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
```
Raw data
{
"_id": null,
"home_page": null,
"name": "django-s3-file-field",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "\"Kitware, Inc.\" <kitware@kitware.com>",
"keywords": "django, django-widget, minio, s3",
"author": null,
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/00/12/75faeee446a82c75dc5c505331e5952ea3a2a39e85c3f60fc02c8dec7fdb/django_s3_file_field-1.0.1.tar.gz",
"platform": null,
"description": "# django-s3-file-field\n[![PyPI](https://img.shields.io/pypi/v/django-s3-file-field)](https://pypi.org/project/django-s3-file-field/)\n\ndjango-s3-file-field is a Django library for uploading files directly to\n[AWS S3](https://aws.amazon.com/s3/) or [MinIO](https://min.io/) Storage from HTTP clients\n(browsers, CLIs, etc.).\n\n### Benefits\ndjango-s3-file-field makes long-running file transfers (with large files or slow connections)\nmore efficient, as the file content is no longer proxied through the Django server. This also frees\nDjango from needing to maintain active HTTP requests during file upload, decreasing server load and\nfacilitating deployment to environments like\n[Heroku, which have short, strict request timeouts](https://devcenter.heroku.com/articles/request-timeout).\n\n### Scope\nThe principal API of django-s3-file-field is the `S3FileField`, which is a subclass of\n[Django's `FileField`](https://docs.djangoproject.com/en/4.2/ref/models/fields/#filefield).\ndjango-s3-file-field does not affect any operations other than uploading from external HTTP\nclients; for all other file operations (downloading, uploading from the Python API, etc.), refer to\n[Django's file management documentation](https://docs.djangoproject.com/en/4.2/topics/files/).\n\ndjango-s3-file-field supports both the creation and modification (by overwrite) of\n`S3FileField`-containing `Model` instances.\nIt supports server-rendered views, via the Forms API, with Form `Field` and `Widget` subclasses\nwhich will automatically be used for `ModelForm` instances.\nIt also supports RESTful APIs, via Django Rest Framework's Serializer API, with a\nSerializer `Field` subclass which will automatically be used for `ModelSerializer` instances.\n\n## Installation\ndjango-s3-file-field must be used with a compatible Django Storage, which are:\n* `S3Storage` in [django-storages](https://django-storages.readthedocs.io/),\n for [AWS S3](https://aws.amazon.com/s3/)\n* `MinioStorage` or `MinioMediaStorage` in [django-minio-storage](https://django-minio-storage.readthedocs.io/),\n for [MinIO](https://min.io/)\n\nAfter the appropriate Storage is installed and configured, install django-s3-file-field, using the\ncorresponding extra:\n```bash\npip install django-s3-file-field[s3]\n```\nor\n```bash\npip install django-s3-file-field[minio]\n```\n\nEnable django-s3-file-field as an installed Django app:\n```python\n# settings.py\nINSTALLED_APPS = [\n ...,\n 's3_file_field',\n]\n```\n\nAdd django-s3-file-field's URLconf to the root URLconf; the path prefix (`'api/s3-upload/'`)\ncan be changed arbitrarily as desired:\n```python\n# urls.py\nfrom django.urls import include, path\n\nurlpatterns = [\n ...,\n path('api/s3-upload/', include('s3_file_field.urls')),\n]\n```\n\n## Usage\nFor all usage, define an `S3FileField` on a Django `Model`, instead of a `FileField`:\n```python\nfrom django.db import models\nfrom s3_file_field import S3FileField\n\nclass Resource(models.Model):\n blob = S3FileField()\n```\n\n### Django Forms\nWhen defining a\n[Django `ModelForm`](https://docs.djangoproject.com/en/4.2/topics/forms/modelforms/),\nthe appropriate Form `Field` will be automatically used:\n```python\nfrom django.forms import ModelForm\nfrom .models import Resource\n\nclass ResourceForm(ModelForm):\n class Meta:\n model = Resource\n fields = ['blob']\n```\n\nForms using django-s3-file-field include additional\n[assets](https://docs.djangoproject.com/en/4.2/topics/forms/media/), which it's essential to render\nalong with the Form. Typically, this can be done in any Form-containing Template as:\n```\n<head>\n {# Assuming the Form is availible in context as \"form\" #}\n {{ form.media }}\n</head>\n```\n\n### Django Rest Framework\nWhen defining a\n[Django Rest Framework `ModelSerializer`](https://www.django-rest-framework.org/api-guide/serializers/#modelserializer),\nthe appropriate Serializer `Field` will be automatically used:\n```python\nfrom rest_framework import serializers\nfrom .models import Resource\n\nclass ResourceSerializer(serializers.ModelSerializer):\n class Meta:\n model = Resource\n fields = ['blob']\n```\n\nClients interacting with these RESTful APIs will need to use a corresponding django-s3-file-field\nclient library. Client libraries (and associated documentation) are available for:\n* [Python](python-client/README.md)\n* [Javascript / TypeScript](javascript-client/README.md)\n\n### Pytest\nWhen installed, django-s3-file-field makes several\n[Pytest fixtures](https://docs.pytest.org/en/latest/explanation/fixtures.html) automatically\navailable for use.\n\nThe `s3ff_field_value` fixture will return a valid input value for Django `ModelForm` or\nDjango Rest Framework `ModelSerializer` subclasses:\n```python\nfrom .forms import ResourceForm\n\ndef test_resource_form(s3ff_field_value: str) -> None:\n form = ResourceForm(data={'blob': s3ff_field_value})\n assert form.is_valid()\n```\n\nAlternatively, the `s3ff_field_value_factory` fixture transforms a `File` object into a valid input\nvalue (for Django `ModelForm` or Django Rest Framework `ModelSerializer` subclasses), providing\nmore control over the uploaded file:\n```python\nfrom django.core.files.storage import default_storage\nfrom rest_framework.test import APIClient\n\ndef test_resource_create(s3ff_field_value_factory):\n client = APIClient()\n stored_file = default_storage.open('some_existing_file.txt')\n s3ff_field_value = s3ff_field_value_factory(stored_file)\n resp = client.post('/resource', data={'blob': s3ff_field_value})\n assert resp.status_code == 201\n```\n",
"bugtrack_url": null,
"license": "Apache 2.0",
"summary": "A Django library for uploading files directly to AWS S3 or MinIO Storage from HTTP clients.",
"version": "1.0.1",
"project_urls": {
"Bug Reports": "https://github.com/girder/django-s3-file-field/issues",
"Repository": "https://github.com/girder/django-s3-file-field"
},
"split_keywords": [
"django",
" django-widget",
" minio",
" s3"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "88e6e06b28894fdb0d5ac34d9bc2e8faba732f9714e926675ee3632f172d7605",
"md5": "87f4e7f02dd440dcd52b1f201c5f5dbe",
"sha256": "4a607367b8bacf4d4c76cbea9f172e7c98e15da1efb839a4cdcb48a5b41036c4"
},
"downloads": -1,
"filename": "django_s3_file_field-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "87f4e7f02dd440dcd52b1f201c5f5dbe",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 37402,
"upload_time": "2024-03-22T04:32:51",
"upload_time_iso_8601": "2024-03-22T04:32:51.586722Z",
"url": "https://files.pythonhosted.org/packages/88/e6/e06b28894fdb0d5ac34d9bc2e8faba732f9714e926675ee3632f172d7605/django_s3_file_field-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "001275faeee446a82c75dc5c505331e5952ea3a2a39e85c3f60fc02c8dec7fdb",
"md5": "601ab171ed487f74939c9f4a0d2d065f",
"sha256": "093675afbf29ba874fc02ac6a70c826919fab952689dbcb32848ae5c318b4ca7"
},
"downloads": -1,
"filename": "django_s3_file_field-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "601ab171ed487f74939c9f4a0d2d065f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 33997,
"upload_time": "2024-03-22T04:32:55",
"upload_time_iso_8601": "2024-03-22T04:32:55.541972Z",
"url": "https://files.pythonhosted.org/packages/00/12/75faeee446a82c75dc5c505331e5952ea3a2a39e85c3f60fc02c8dec7fdb/django_s3_file_field-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-22 04:32:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "girder",
"github_project": "django-s3-file-field",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "django-s3-file-field"
}