A Django库,允许HTTP客户端直接将文件上传到AWS S3或MinIO存储。
项目描述
django-s3-file-field
django-s3-file-field 是一个 Django 库,允许通过 HTTP 客户端(浏览器、CLI 等)直接将文件上传到 AWS S3 或 MinIO 存储。
优点
django-s3-file-field 使得长时间运行的文件传输(大文件或慢速连接)更有效率,因为文件内容不再通过 Django 服务器代理。这也使 Django 在文件上传期间无需保持活跃的 HTTP 请求,从而降低服务器负载,并便于部署到具有短、严格请求超时环境的 Heroku。
范围
django-s3-file-field 的主要 API 是 S3FileField
,它是 Django 的 FileField
的子类。django-s3-file-field 不会影响除从外部 HTTP 客户端上传以外的任何操作;对于所有其他文件操作(下载、从 Python API 上传等),请参阅 Django 的文件管理文档。
django-s3-file-field 支持创建和修改(通过覆盖)包含 S3FileField
的 Model
实例。它通过 Forms API 支持服务器端渲染的视图,具有自动用于 ModelForm
实例的 Form Field
和 Widget
子类。它还支持通过 Django Rest Framework 的 Serializer API 的 RESTful API,具有自动用于 ModelSerializer
实例的 Serializer Field
子类。
安装
django-s3-file-field 必须与兼容的 Django Storage 一起使用,这些存储包括
S3Storage
在 django-storages 中,用于 AWS S3MinioStorage
或MinioMediaStorage
在 django-minio-storage 中,用于 MinIO
安装适当的 Storage 并配置后,使用相应的额外
pip install django-s3-file-field[s3]
或
pip install django-s3-file-field[minio]
将 django-s3-file-field 作为已安装的 Django 应用程序启用
# settings.py
INSTALLED_APPS = [
...,
's3_file_field',
]
将 django-s3-file-field 的 URLconf 添加到根 URLconf;路径前缀('api/s3-upload/'
)可以任意更改
# urls.py
from django.urls import include, path
urlpatterns = [
...,
path('api/s3-upload/', include('s3_file_field.urls')),
]
用法
对于所有用法,在 Django Model
上定义一个 S3FileField
,而不是 FileField
from django.db import models
from s3_file_field import S3FileField
class Resource(models.Model):
blob = S3FileField()
Django 表单
在定义 Django ModelForm
时,将自动使用适当的 Form Field
from django.forms import ModelForm
from .models import Resource
class ResourceForm(ModelForm):
class Meta:
model = Resource
fields = ['blob']
使用 django-s3-file-field 的表单包含额外的 资源,这些资源与表单一起渲染。通常,这可以在任何包含表单的模板中完成
<head>
{# Assuming the Form is availible in context as "form" #}
{{ form.media }}
</head>
Django Rest Framework
在定义 Django Rest Framework ModelSerializer
时,将自动使用适当的 Serializer Field
from rest_framework import serializers
from .models import Resource
class ResourceSerializer(serializers.ModelSerializer):
class Meta:
model = Resource
fields = ['blob']
与这些 RESTful API 交互的客户端需要使用相应的 django-s3-file-field 客户端库。对于以下内容,可用的客户端库(和相关文档)包括
Pytest
安装后,django-s3-file-field 会自动提供几个 Pytest 修复 以供使用。
s3ff_field_value
修复将返回 Django ModelForm
或 Django Rest Framework ModelSerializer
子类的有效输入值
from .forms import ResourceForm
def test_resource_form(s3ff_field_value: str) -> None:
form = ResourceForm(data={'blob': s3ff_field_value})
assert form.is_valid()
或者,s3ff_field_value_factory
修复将文件对象转换为有效的输入值(用于 Django ModelForm
或 Django Rest Framework ModelSerializer
子类),提供对上传文件的更多控制
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
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。