2012-07-09 60 views
5

我一直在嘗試爲我的Heroku應用程序設置一個MEDIA_URL,該應用程序目前正在通過STATIC_URL從Amazon S3提供靜態文件。靜態文件工作正常,但是當我嘗試添加除當前STATIC_URL之外的MEDIA_URL時,頁面不再呈現,應用程序停止工作。爲Django Heroku App設置MEDIA_URL,Amazon S3

目前的設置是:

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' 

當我添加:

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

導致問題。特別是,MEDIA_URL有問題,因爲DEFAULT_FILE_STORAGE被刪除時,它仍然有相同的問題。但我試圖最終確定如何通過這種方式爲用戶上傳的媒體提供服務。

如果任何人有任何見解如何最好地實現這一點,它將不勝感激。

回答

2

STATIC_URL和MEDIA_URL不能具有相同的值,它會引發錯誤。

我有/仍然有同樣的問題,找不到一個乾淨的方式來做到這一點。等待更好的答案,但這是我如何解決它(醜陋的黑客):

我使用django_storagesdjango_compressor。由於媒體文件出現在我的S3存儲桶的根目錄中,我可以通過STATIC_URL訪問它們。在我的settings.py中:

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

在我的本地開發環境中,我使用MEDIA_URL和生產STATIC_URL。設置一個環境變量,其值爲本地env的True值,Heroku中的False值並將其放入context_processor env中。

然後你就可以訪問媒體文件在你的模板是這樣的:

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

它的工作原理,但它是醜陋的。希望有人找到了一個更好的解決辦法,所以我跑了重構我的代碼:)

編輯 有一個更好的辦法:this app讓您創建一個靜態的,S3媒體文件夾。

+0

我結束了剛剛設置DEFAULT_FILE_STORAG,其中一半排序作品。有些媒體直接進入亞馬遜S3(用戶提交的圖像),而其他的則不是。雖然使用sorlthumbnail的照片完全失敗。你的方式可能會奏效。 – 2012-07-10 17:26:13

+0

我花了一些時間在這個上,我發現了一種很好的方式:我使用[這個小應用](https://github.com/jamstooks/django-s3-folder-storage),讓你有一個靜態和S3存儲桶中的媒體文件夾。希望有所幫助! – tiwei 2012-07-10 20:26:02

+0

這是如何處理安全性的?並非所有的文件都是公開的嗎? – citynorman 2018-01-03 19:11:10

4

This解決方案工作得很好,如下所述。

創建一個在同一目錄下名爲s3utils.py文件settings.py

from storages.backends.s3boto import S3BotoStorage 

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

然後在settings.py

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

爲我工作,但也需要添加幾行以與靜態和媒體文件的輸出同步:S3_URL ='http://'+ AWS_STORAGE_BUCKET_NAME +'.s3.amazonaws.com'' STATIC_URL = S3_URL +'靜態/' MEDIA_URL = S3_URL +'media /' – 2014-02-13 03:10:29