2015-07-11 13 views
19

Tôi đã thiết lập thành công ứng dụng của mình để sử dụng S3 để lưu trữ tất cả các tệp tĩnh và phương tiện. Tuy nhiên, tôi muốn tải lên S3 (hoạt động hiện tại), nhưng phục vụ từ một trường hợp đám mây mà tôi đã thiết lập. Tôi đã thử điều chỉnh cài đặt thành url trên đám mây nhưng nó không hoạt động. Làm thế nào tôi có thể tải lên S3 và phục vụ từ Cloudfront?Sử dụng Cloudfront với Django S3Boto

Cài đặt

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

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 
+2

Bạn có thêm thông tin tại sao nó không hoạt động không? Có thông báo lỗi nào không? –

+0

Điều này đã được trả lời tại đây: http://stackoverflow.com/questions/8688815/django-compressor-how-to-write-to-s3-read-from-cloudfront/8888930#8888930 –

+0

Trong trường hợp nó giúp mọi người, Tôi cũng phải thêm cài đặt 'AWS_DEFAULT_ACL = ''' cho 'collectstatic' để hoạt động và không trả về 403. – Danra

Trả lời

29

Mã của bạn là gần như hoàn toàn ngoại trừ bạn không thêm miền CloudFront của bạn để STATIC_URL/MEDIA_URL và kho tùy chỉnh của bạn.

Cụ thể, trước tiên bạn phải cài đặt phụ thuộc

pip install django-storages-redux boto 

Thêm các thiết lập cần thiết để thiết lập django bạn nộp

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' 

kho tùy chỉnh của bạn cần một số sửa đổi để trình bày các miền CloudFront cho các nguồn lực , thay vì tên miền 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) 

Và đó là tất cả những gì bạn cần, giả sử rằng miền của bạn và miền trên đám mây được liên kết chính xác và AWS_ACCESS_KEY của người dùng có quyền truy cập vào nhóm của bạn. Ngoài ra, dựa trên trường hợp sử dụng của bạn, bạn có thể muốn làm cho các mục s3 của bạn chỉ đọc bởi tất cả mọi người.

+0

Câu trả lời tuyệt vời, súc tích. – Danra

+1

Tôi có thể hỏi tại sao 'MEDIA_URL = '//% s /% s /' thay vì 'MEDIA_URL =' http: //% 2 /% s /' được ưu tiên? – eugene

+1

@eugene Bằng cách bỏ qua trình chỉ định giao thức ('//' thay vì 'http: //' hoặc 'https: //'), bạn cho phép trình duyệt tự động chọn giao thức thích hợp (http hoặc https) theo cách chứa tài liệu đã được tải. Vì vậy, bạn có thể phục vụ cả các trang bảo mật và không bảo mật và có các liên kết tĩnh vẫn giữ nguyên. Xem ví dụ: http://stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just –

2

Tôi gặp sự cố tương tự và chỉ cần đặt AWS_S3_CUSTOM_DOMAIN thành url Cloudfront trong số settings.py của Django đã hoạt động đối với tôi. Bạn có thể kiểm tra mã số here.

Các vấn đề liên quan