简体   繁体   English

将Cloudfront与Django S3Boto配合使用

[英]Using Cloudfront with Django S3Boto

I have successfully set up my app to use S3 for storing all static and media files. 我已成功设置我的应用程序以使用S3存储所有静态和媒体文件。 However, I would like to upload to S3 (current operation), but serve from a cloudfront instance I have set up. 但是,我想上传到S3(当前操作),但是从我设置的云端实例提供服务。 I have tried adjusting settings to the cloudfront url but it does not work. 我已经尝试将设置调整到cloudfront网址,但它不起作用。 How can I upload to S3 and serve from Cloudfront please? 如何上传到S3并从Cloudfront服务?

Settings 设置

AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

DEFAULT_FILE_STORAGE = 'app.custom_storages.MediaStorage'
STATICFILES_STORAGE = 'app.custom_storages.StaticStorage'

STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'

STATIC_URL = "https://s3-eu-west-1.amazonaws.com/app/%s/" % (STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)

custom_storages.py custom_storages.py

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class StaticStorage(S3BotoStorage):
    location = settings.STATICFILES_LOCATION

class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION

Your code is almost complete except you are not adding your cloudfront domain to STATIC_URL/MEDIA_URL and your custom storages. 您的代码几乎已完成,除非您没有将您的cloudfront域添加到STATIC_URL / MEDIA_URL和您的自定义存储。

In detail, you must first install the dependencies 具体而言,您必须首先安装依赖项

pip install django-storages-redux boto

Add the required settings to your django settings file 将所需的设置添加到django设置文件中

INSTALLED_APPS = (
    ...
    'storages',
    ...
)

AWS_STORAGE_BUCKET_NAME = 'mybucketname'
AWS_CLOUDFRONT_DOMAIN = 'xxxxxxxx.cloudfront.net'
AWS_ACCESS_KEY_ID = get_secret("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = get_secret("AWS_SECRET_ACCESS_KEY")

MEDIAFILES_LOCATION = 'media'
MEDIA_ROOT = '/%s/' % MEDIAFILES_LOCATION
MEDIA_URL = '//%s/%s/' % (AWS_CLOUDFRONT_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'app.custom_storages.MediaStorage'

STATICFILES_LOCATION = 'static'
STATIC_ROOT = '/%s/' % STATICFILES_LOCATION
STATIC_URL = '//%s/%s/' % (AWS_CLOUDFRONT_DOMAIN, STATICFILES_LOCATION)
STATICFILES_STORAGE = 'app.custom_storages.StaticStorage'

Your custom storages need some modification to present the cloudfront domain for the resources, instead of the S3 domain: 您的自定义存储需要进行一些修改才能显示资源的云端域,而不是S3域:

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class StaticStorage(S3BotoStorage):
"""uploads to 'mybucket/static/', serves from 'cloudfront.net/static/'"""
    location = settings.STATICFILES_LOCATION

    def __init__(self, *args, **kwargs):
        kwargs['custom_domain'] = settings.AWS_CLOUDFRONT_DOMAIN
        super(StaticStorage, self).__init__(*args, **kwargs)

class MediaStorage(S3BotoStorage):
"""uploads to 'mybucket/media/', serves from 'cloudfront.net/media/'"""
    location = settings.MEDIAFILES_LOCATION

    def __init__(self, *args, **kwargs):
        kwargs['custom_domain'] = settings.AWS_CLOUDFRONT_DOMAIN
        super(MediaStorage, self).__init__(*args, **kwargs)

And that is all you need, assuming your bucket and cloudfront domain are correctly linked and the user's AWS_ACCESS_KEY has access permissions to your bucket. 假设您的存储桶和云端域正确链接且用户的AWS_ACCESS_KEY具有对您的存储桶的访问权限,那就是您所需要的一切。 Additionally, based on your use case, you may wish to make your s3 bucket items read-only accessible by everyone. 此外,根据您的使用情况,您可能希望每个人都可以只读取您的s3存储桶项目。

I had a similar issue and just setting AWS_S3_CUSTOM_DOMAIN to the Cloudfront url in Django's settings.py worked for me. 我有一个类似的问题,只是设置AWS_S3_CUSTOM_DOMAIN到的Cloudfront网址在Django的settings.py为我工作。 You can check the code here . 你可以在这里查看代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM