添加直接上传到S3功能,并在文件输入字段中添加进度条。

django-s3direct的Python项目详细描述


django-s3direct

从Django直接将文件上载到S3(或兼容服务)。

Build Status

使用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

视图.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>

示例

两种方法的示例都可以在examples文件夹中找到。运行它们:

$ 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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java嵌套循环打印一个数字,旁边有相同数量的星号   java JodReports替代方案   java如何将模型类parcelable对象从片段传递到活动?   java JCS缓存删除功能不删除特定元素   如何打开。Java的dll文件。   java在这种情况下如何选择聚合根?   java从CellEditorListener获取编辑的TreeNode   Java到web服务和mysql   从openssl ec在Java中创建公钥时出现加密无效密钥异常   Java数组:添加多个数组的元素时忽略空数组   java在初始化后向fragment发送数据   JButtons的java数组正在返回void   若联接列不包含特定值,则java JPA条件生成器仅返回实体   java ActionBar问题:NPE   java Portlet是被广泛使用还是非常罕见?