Django使用S3服务

假设已经有S3的bucket存储

安装依赖module

    $ pip install django-storages boto

配置Django

static静态文件和media多媒体(多为用户上传)需要分目录存储,新建s3utils.py文件:

from storages.backends.s3boto import S3BotoStorage

StaticS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaS3BotoStorage = lambda: S3BotoStorage(location='media')

settings.py添加S3配置:

AWS_STORAGE_BUCKET_NAME = 'horoscope-cxclient'
DEFAULT_FILE_STORAGE = 'horoscope_web.src.s3utils.MediaS3BotoStorage'
STATICFILES_STORAGE = 'horoscope_web.src.s3utils.StaticS3BotoStorage'

S3_URL = 'http://%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATIC_DIRECTORY = '/static/'
MEDIA_DIRECTORY = '/media/'
STATIC_URL = S3_URL + STATIC_DIRECTORY
MEDIA_URL = S3_URL + MEDIA_DIRECTORY

因为S3开放了本机访问权限,因为不需要认证。

需要认证的添加 KEY_ID 和ACCESS_KEY:

AWS_ACCESS_KEY_ID = 'YOURACCESSKEY'
AWS_SECRET_ACCESS_KEY = 'YOURSECRETACCESSKEY'

部署

运行collectstaticDjango管理命令

静态文件应该以http://horoscope-cxclient.s3.amazonaws.com/static/为结尾。

任何上传的文件FileField或ImageField模型上的属性都应该在http://horoscope-cxclient.s3.amazonaws.com/media/中。如果这些模型属性指定upload_to路径,则存储于/media/***

CDN配置

如上配置配置成功后,资源访问域名是https://horoscope-cxclient.s3.amazonaws.com/media/

https://horoscope-cxclient.s3.amazonaws.com/media/fortunes_wci_img/wci_c013086e41c4e4159dc42b6b0448b6c8.png

发现资源加载速度慢了很多,17K耗时将近两秒,而且不同区域访问不稳定。

此时就应该祭出CDN了 知乎CDN

CDN HOST:http://***.cloudfront.net/,解析至http://static.mobileapp666.com域名下,settings配置:

AWS_S3_SECURE_URLS = False
#AWS_S3_USE_SSL = False
AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
AWS_S3_CUSTOM_DOMAIN = 'static.mobileapp666.com'

重启后资源通过http://static.mobileapp666.com/**访问,速度有了明显的提高。

AWS_S3_SECURE_URLS: 是否启动安全网址,即是否使用https, 默认为True,因为https需要申请证书等等一系列处理,暂时设置为False后将使用http协议。


使用 staticfiles

The one from staticfiles ({% load static from staticfiles %}) is smarter - it uses whatever storage class you've configured for static files to come up with the URL.

By using the one from staticfiles from the start, you'll be prepared for any storage class you might decide to use in the future.


常用命令:

  1. 查看
    aws s3 ls s3://bucketname/
    aws s3 ls s3://bucketname/dir_name

  2. 上传

单个文件
aws s3 cp 目标文件 上传路径
aws s3 cp source_file s3://bucktename/dir_name

上传目录 需要添加参数 --recursive

aws s3 cp source_file s3://bucktename/dir_name --recursive

AWS CLI命令参考:AWS CLI Command Reference


参考:

django-s3-temporary

cname-support-aws_s3_custom_domain-doesnt

django-wont-serve-static-files-from-amazon-s3-with-custom-domain

Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files

你可能感兴趣的:(Django使用S3服务)