添加直接上传到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如何拆分字符串(基于各种分隔符),但不保留空格?   解析。Json格式的txt文件和knime中的java   java Spring rest api为什么在rest api调用的响应中更改了数据类型   升华文本3抛出java。lang.ClassNotFoundException,而记事本++不存在   java Android指纹扫描仪在尝试5次后停止工作?   java Android如何设置精确的重复报警?   java如何使用HTTPGET connect为access API输入用户名和密码   java当测试报告显示没有测试失败时,Gradle为什么说“有失败的测试”?   用Gson实现java获取响应   MapReduce程序中函数错误的java不可映射参数   java spring安全性不符合自动代理的条件   java GWT使用异步回调进行同步/阻塞调用   java奇怪的类数组问题无法在jsp中显示   如何在java中使用PrinterJob使用epl打印条形码   java如何在JTable中居中单元格   将Java Mockito测试转换为Kotlin   html Java正则表达式模式匹配到多个相同标记   testCompile中缺少java Gradle(Android)多项目依赖项   在输入提示后输入字符串时发生java FileNotFoundException