跳转到主要内容

A Django库,允许HTTP客户端直接将文件上传到AWS S3或MinIO存储。

项目描述

django-s3-file-field

PyPI

django-s3-file-field 是一个 Django 库,允许通过 HTTP 客户端(浏览器、CLI 等)直接将文件上传到 AWS S3MinIO 存储。

优点

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 支持创建和修改(通过覆盖)包含 S3FileFieldModel 实例。它通过 Forms API 支持服务器端渲染的视图,具有自动用于 ModelForm 实例的 Form FieldWidget 子类。它还支持通过 Django Rest Framework 的 Serializer API 的 RESTful API,具有自动用于 ModelSerializer 实例的 Serializer Field 子类。

安装

django-s3-file-field 必须与兼容的 Django Storage 一起使用,这些存储包括

安装适当的 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

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

django_s3_file_field-1.0.1.tar.gz (34.0 kB 查看哈希值)

上传时间 源代码

构建分发

django_s3_file_field-1.0.1-py3-none-any.whl (37.4 kB 查看哈希值)

上传时间 Python 3

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面