2012-07-09 40 views
5

Tôi đã cố gắng thiết lập MEDIA_URL cho ứng dụng Heroku của mình, hiện đang phân phát tệp tĩnh qua STATIC_URL từ Amazon S3. Các tệp tĩnh đang hoạt động tốt, nhưng khi tôi cố gắng thêm MEDIA_URL ngoài STATIC_URL hiện tại, các trang không còn hiển thị và ứng dụng ngừng hoạt động.Cài đặt MEDIA_URL cho ứng dụng Django Heroku, Amazon S3

Các thiết lập hiện tại là:

AWS_STORAGE_BUCKET_NAME = 'bucketname' 
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME 
STATIC_URL = S3_URL 
AWS_ACCESS_KEY_ID = 'KEY' 
AWS_SECRET_ACCESS_KEY = 'SECRET_KEY' 

Khi tôi thêm:

MEDIA_URL = S3_URL 
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

gây vấn đề này. Cụ thể, MEDIA_URL có vấn đề khi DEFAULT_FILE_STORAGE bị xóa, nó vẫn có cùng một vấn đề. Nhưng tôi đang cố gắng xác định cách tốt nhất để phân phát phương tiện đã tải lên của người dùng thông qua việc này không thành công.

Nếu bất kỳ ai có bất kỳ thông tin chi tiết nào tốt nhất để đạt được điều này, nó sẽ được đánh giá cao nhất.

Trả lời

2

STATIC_URL và MEDIA_URL không thể có cùng giá trị, nó sẽ gây ra lỗi.

Tôi đã có/vẫn gặp sự cố tương tự và không thể tìm thấy cách làm sạch. Hãy chờ câu trả lời tốt hơn, nhưng đây là cách tôi giải quyết nó (hack xấu xí):

Tôi đang sử dụng django_storagesdjango_compressor. Vì các tệp phương tiện xuất hiện trong thư mục gốc của nhóm S3 của tôi, tôi có thể truy cập chúng thông qua STATIC_URL. Trong settings.py của tôi:

COMPRESS_URL = "https://s3.amazonaws.com/bucketname/" 
STATIC_URL = COMPRESS_URL 

Trong môi trường dev địa phương của tôi, tôi sử dụng MEDIA_URL và cho sản xuất STATIC_URL. Đặt một biến môi trường có giá trị True cho env địa phương của bạn và False trên Heroku và đặt nó trong một context_processor env.

Sau đó, bạn có thể truy cập các tập tin media trong các mẫu của bạn như thế này:

background-image: url({% if env == 'True' %}{{ MEDIA_URL }}{% else %}{{ STATIC_URL }}{% endif %}{{ course.image }}); 

Nó hoạt động, nhưng nó là xấu xí. Hy vọng ai đó tìm thấy một giải pháp tốt hơn vì vậy tôi chạy Refactor mã của tôi :)

chỉnh sửa Có một cách tốt hơn: this app phép bạn tạo một tĩnh và một thư mục phương tiện truyền thông trong S3.

+0

tôi đã kết thúc chỉ đặt DEFAULT_FILE_STORAG, trong đó loại công trình nửa. Một số phương tiện truyền thông sẽ trực tiếp đến Amazon S3 (hình ảnh do người dùng gửi) trong khi các nội dung khác thì không. Tuy nhiên, hình ảnh sử dụng sorlthumbnail hoàn toàn thất bại. Cách của bạn có thể hoạt động. –

+0

Tôi dành nhiều thời gian hơn cho việc này và tôi đã tìm ra cách hoạt động tốt: Tôi đã sử dụng [ứng dụng nhỏ này] (https://github.com/jamstooks/django-s3-folder-storage) cho phép bạn có một cách tĩnh và một thư mục media trong thùng S3 của bạn. Hy vọng rằng sẽ giúp! – tiwei

+0

Làm thế nào điều này đối phó với an ninh? Không phải tất cả các tệp đều được công khai? – citynorman

4

This giải pháp hoạt động khá tốt, như được mô tả bên dưới.

Tạo một tập tin gọi s3utils.py trong cùng thư mục với settings.py:

from storages.backends.s3boto import S3BotoStorage 

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') 
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media') 

Sau đó, trong settings.py:

DEFAULT_FILE_STORAGE = 'myproyect.s3utils.MediaRootS3BotoStorage' 
STATICFILES_STORAGE = 'myproyect.s3utils.StaticRootS3BotoStorage' 
+1

Làm việc cho tôi, nhưng cũng cần thêm một vài dòng để đồng bộ hóa với đầu ra của các tệp tĩnh và phương tiện: S3_URL = 'http: //' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com /' STATIC_URL = S3_URL + ' tĩnh/' MEDIA_URL = S3_URL +' phương tiện/' –

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