添加直接上传到S3功能,并在文件输入字段中添加进度条。
django-s3direct的Python项目详细描述
django-s3direct
从Django直接将文件上载到S3(或兼容服务)。
使用django直接将文件上载到s3和其他兼容服务(如Digital Ocean's Spaces)。
安装
使用pip安装:pip install django-s3direct
访问设置
设置访问凭据时,有两个选项:
选项1:
生成访问凭据并将其直接添加到django设置中。 如果使用amazon s3,您还需要创建一个iam策略,该策略授予 允许将新创建的凭据上载到您的存储桶。 记住用your_bucket_name替换实际的bucket。
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetObject","s3:PutObject","s3:PutObjectAcl","s3:ListMultipartUploadParts","s3:AbortMultipartUpload"],"Resource":"arn:aws:s3:::YOUR_BUCKET_NAME/*"}]}
选项2:
使用ec2实例配置文件及其附加的iam角色(仅限aws)
您需要确保除了
以上政策。你还需要
boto3已安装程序包。
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}
CORS设置
你需要在你的水桶上加上一个cors保险单。注意etag头是 重要,因为它用于多部分上传。有关更多信息,请参见 here。 记住在下面的示例中交换掉yourdomain.com,包括port if 在当地发展。
如果使用数字海洋空间,则必须通过api/s3cmd上传cors配置
cli(因为您不能添加ExposeHeader
规则)。见
here
更多细节。
<CORSConfiguration><CORSRule><AllowedOrigin>http://YOURDOMAIN.COM:8080</AllowedOrigin><AllowedMethod>GET</AllowedMethod><AllowedMethod>HEAD</AllowedMethod><AllowedMethod>PUT</AllowedMethod><AllowedMethod>POST</AllowedMethod><AllowedMethod>DELETE</AllowedMethod><MaxAgeSeconds>3000</MaxAgeSeconds><ExposeHeader>ETag</ExposeHeader><AllowedHeader>*</AllowedHeader></CORSRule></CORSConfiguration>
django设置
设置.py
INSTALLED_APPS=[...'s3direct',...]TEMPLATES=[{...'APP_DIRS':True,...}]# AWS# If these are set to None, the EC2 instance profile and IAM role are used.AWS_ACCESS_KEY_ID='your-aws-access-key-id'AWS_SECRET_ACCESS_KEY='your-aws-secret-access-key'# Bucket nameAWS_STORAGE_BUCKET_NAME='your-aws-s3-bucket-name'# The region of your bucket, more info:# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_regionAWS_S3_REGION_NAME='eu-west-1'# The endpoint of your bucket, more info:# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_regionAWS_S3_ENDPOINT_URL='https://s3-eu-west-1.amazonaws.com'S3DIRECT_DESTINATIONS={'example_destination':{# "key" [required] The location to upload file# 1. String: folder path to upload to# 2. Function: generate folder path + filename using a function 'key':'uploads/images',# "auth" [optional] Limit to specfic Django users# Function: ACL function'auth':lambdau:u.is_staff,# "allowed" [optional] Limit to specific mime types# List: list of mime types'allowed':['image/jpeg','image/png','video/mp4'],# "bucket" [optional] Bucket if different from AWS_STORAGE_BUCKET_NAME# String: bucket name'bucket':'custom-bucket',# "endpoint" [optional] Endpoint if different from AWS_S3_ENDPOINT_URL# String: endpoint URL'endpoint':'custom-endpoint',# "region" [optional] Region if different from AWS_S3_REGION_NAME# String: region name'region':'custom-region',# Default is 'AWS_S3_REGION_NAME'# "acl" [optional] Custom ACL for object, default is 'public-read'# String: ACL'acl':'private',# "cache_control" [optional] Custom cache control header# String: header'cache_control':'max-age=2592000',# "content_disposition" [optional] Custom content disposition header# String: header'content_disposition':lambdax:'attachment; filename="{}"'.format(x),# "content_length_range" [optional] Limit file size# Tuple: (from, to) in bytes'content_length_range':(5000,20000000),# "server_side_encryption" [optional] Use serverside encryption# String: encrytion standard'server_side_encryption':'AES256',# "allow_existence_optimization" [optional] Checks to see if file already exists,# returns the URL to the object if so (no upload)# Boolean: True, False'allow_existence_optimization':False,},'example_destination_two':{'key':lambdafilename,args:args+'/'+filename,'key_args':'uploads/images',}}
url.py
urlpatterns=[...url(r'^s3direct/',include('s3direct.urls')),...]
如果需要,请运行python manage.py collectstatic
。
在django admin中使用
型号.py
fromdjango.dbimportmodelsfroms3direct.fieldsimportS3DirectFieldclassExample(models.Model):video=S3DirectField(dest='example_destination')
以自定义形式使用小部件
表格.py
fromdjangoimportformsfroms3direct.widgetsimportS3DirectWidgetclassS3DirectUploadForm(forms.Form):images=forms.URLField(widget=S3DirectWidget(dest='example_destination'))
*可选。您可以通过覆盖模板s3direct/templates/s3direct widget.tpl修改小部件的HTML
两种方法的示例都可以在examples文件夹中找到。运行它们: 访问视图.py
fromdjango.views.genericimportFormViewfrom.formsimportS3DirectUploadFormclassMyView(FormView):template_name='form.html'form_class=S3DirectUploadForm
模板/form.html
<html><head><metacharset="utf-8"><title>s3direct</title>
{{ form.media }}
</head><body><formaction=""method="post">{% csrf_token %}
{{ form.as_p }}
</form></body></html>
示例
$ git clone git@github.com:bradleyg/django-s3direct.git
$ cd django-s3direct
$ python setup.py install
$ cd example
# Add config to your environmentexportAWS_ACCESS_KEY_ID='…'exportAWS_SECRET_ACCESS_KEY='…'exportAWS_STORAGE_BUCKET_NAME='…'exportAWS_S3_REGION_NAME='…'exportAWS_S3_ENDPOINT_URL='…'
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver
http://localhost:8000/admin
查看管理小部件和
http://localhost:8000/form
查看自定义表单小部件。开发
$ git clone git@github.com:bradleyg/django-s3direct.git
$ cd django-s3direct
# Add your AWS keys/details to .env file and export
$ cp .env-dist .env
# Build docker image
$ docker build . --build-arg SKIP_TOX=true -t s3direct
$ docker run -itv $(pwd):/code -p 8000-8001:8000-8001 --env-file .env s3direct bash
$ npm i
# Install locally
$ python setup.py develop
# Run examples
$ python example/manage.py migrate
$ python example/manage.py createsuperuser
$ python example/manage.py runserver 0.0.0.0:8000
# Run tox tests
$ tox
# Run tests
$ npm run test# Run frontend bundler and Django server
$ npm run dev
# Watch and build frontend (dev)
$ npm run watch
# Build frontend (prod)
$ npm run build
# Format python // PEP8
$ npm run yapf
# Upload to PYPI
$ npm run pypi
推荐PyPI第三方库