一个django小部件库,用于安全地将文件直接上传到S3(或MinIO)。
django-s3-file-field的Python项目详细描述
django-s3-file-field
django-s3-file-field
是一个Django小部件库,用于直接将文件上载到S3
(或MinIO)通过浏览器。django-s3-file-field在很大程度上依赖于
django-storages包。在
快速启动
确保已将Django安装配置为使用django-storages
进行S3访问:https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html。在
安装django-s3-file-field包:
pip install django-s3-file-field
将s3_file_field
添加到您的INSTALLED_APPS
:
添加所需的设置:
S3FF_UPLOAD_STS_ARN=''# see STS Role section below (not required for minio)
将适当的路由添加到urls.py
:
urlpatterns=[...path('api/s3-upload/',include('s3_file_field.urls')),]
使用
froms3_file_fieldimportS3FileFieldclassCar(db.Model):...owners_manual=S3FileField()
运行检查
django-s3-file-field可以使用django内置的System check framework检测常见的错误配置。确认 您的配置正确,请运行:
./manage.py check
高级主题
高级配置
Key | Default | Description |
---|---|---|
S3FF_UPLOAD_STS_ARN | none | ... |
STS配置
CORS配置
这是一个与django-S3-file-field兼容的S3 bucket的最小功能CORS配置:
<?xml version="1.0" encoding="UTF-8"?><CORSConfigurationxmlns="http://s3.amazonaws.com/doc/2006-03-01/"><CORSRule><AllowedHeader>*</AllowedHeader><AllowedMethod>POST</AllowedMethod><AllowedMethod>PUT</AllowedMethod><AllowedOrigin>*</AllowedOrigin><ExposeHeader>Connection</ExposeHeader><ExposeHeader>Content-Length</ExposeHeader><ExposeHeader>Date</ExposeHeader><ExposeHeader>ETag</ExposeHeader><ExposeHeader>Server</ExposeHeader><ExposeHeader>x-amz-delete-marker</ExposeHeader><ExposeHeader>x-amz-version-id</ExposeHeader><MaxAgeSeconds>600</MaxAgeSeconds></CORSRule></CORSConfiguration>
注意:这些都是不安全的默认值,允许的源和头不应该是通配符,而应该是通配符 针对您的特定部署进行了修改。在
MinIO支持
MinIO支持取决于django MinIO存储配置(请参见https://django-minio-storage.readthedocs.io/en/latest/usage/),使用以下设置
安全考虑事项
与表单集成
如果要在表单中使用S3FileField,则需要在前端注入一些额外的客户端代码。
表单提交只与Django通信,因此web客户端必须在表单提交之前以某种方式将数据直接发送到S3。
必要的<script>
在模板中可用作form.media
,它应该嵌入到表单模板中,类似于:
...
<head>
{{ form.media }}
</head>
...
该脚本将检测表单中呈现的任何s3filefield,并动态重写它们,以便在选择文件时将数据直接上载到S3。在
延伸
django-s3-file-field在调用其REST api时发出两个信号:
s3_file_field_upload_prepare(name:str,object_key:str)s3_file_field_upload_finalize(name:str,object_key:str,status:string)
API参考
- 项目
标签: