2012-07-09 20 views
5

現在、Amazon S3のSTATIC_URL経由で静的ファイルを配信しているHerokuアプリケーションのMEDIA_URLを設定しようとしています。静的ファイルは正常に動作していますが、現在のSTATIC_URLに加えてMEDIA_URLを追加しようとすると、ページはレンダリングされなくなり、アプリケーションは機能しなくなります。Django Heroku App、Amazon S3のMEDIA_URLの設定

現在の設定は次のとおりです。

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、半分作品の並べ替えを設定することになりました。一部のメディアはAmazon S3(ユーザーが投稿した画像)に直接アクセスしていますが、他のものはそうではありません。しかし、sorlthumbnailを使用している写真は完全に失敗しています。あなたの道はうまくいくかもしれない。 –

+0

私はこれにもう少し時間を費やし、うまく動作する方法を見つけました:私は[この小さなアプリ](https://github.com/jamstooks/django-s3-folder-storage)を使って静的あなたのS3バケツの中のメディアフォルダ。希望が助けてくれる! – tiwei

+0

セキュリティはどのように処理されますか?すべてのファイルを公開しているわけではありませんか? – citynorman

4

This解決策は、以下で説明するように、かなりうまく機能します。

ファイルを作成しますsettings.pyと同じディレクトリにs3utils.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 + ' static/' MEDIA_URL = S3_URL +'メディア/ ' –

関連する問題