静的ファイルを提供するAmazonS3を使用してherokuにデプロイされたアプリにdjango-compresorを使用しています。background-image:url()で参照されているcssの画像が正しいパスでレンダリングされないことを除いて、すべてが正常に機能しています。
私の静的ファイルは、次のディレクトリ構造で編成されています。
-static
-myapp
-js
-css
-img
-bootstrap
-js
-css
-img
-othervendor
-js
-css
-img
したがって、url()で使用しているパスは、cssファイルからの相対パスです。
url("../img/icon.png")
すべてのcssファイルが圧縮され、静的ディレクトリのCACHEフォルダーに移動され、CACHEディレクトリへのURLは次のように正しくレンダリングされます。
https://mybucket.s3.amazonaws.com/static/CACHE/css/somehash.css
問題は、cssファイルurl()の画像が次のようにレンダリングされることです。
https://mybucket.s3.amazonaws.com/static/CACHE/img/imagefile.png
そしてそれは次のようになります:
https://mybucket.s3.amazonaws.com/static/myapp/img/imagefile.png
または、画像がCACHEディレクトリにコピーされた場合、これは機能します。
https://mybucket.s3.amazonaws.com/static/CACHE/img/imagefile.png
私の一時的な修正は、css内の画像のパスを次のように変更することです。これは機能します。
url("/static/foldername/img/icon.png")
私はdjangoとcompressorを初めて使用するので、正しい動作がどうあるべきかわかりませんが、これは正しくないようです。私の見方では、djangoコンプレッサーに2つのことのいずれかを実行させることができれば問題を修正できます:1)css url()で参照されているすべての画像をCASHE / imgディレクトリにコピーするか、2)で表される正しいURLをレンダリングする../これが私の設定です:
テンプレートのcssファイルは{%compress css%}ブロックにあります。
s3utils.py(バケット内に個別のメディアディレクトリと静的ディレクトリを作成するために使用)
from storages.backends.s3boto import S3BotoStorage
StaticS3BotoStorage = lambda: S3BotoStorage(location='static')
StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaS3BotoStorage = lambda: S3BotoStorage(location='media')
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media')
settings.py
DEFAULT_FILE_STORAGE = 'myapp.settings.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'myapp.settings.s3utils.StaticRootS3BotoStorage'
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
MEDIA_URL = S3_URL+'media/'
MEDIA_ROOT = S3_URL+'media/'
STATIC_URL = S3_URL+'static/'
STATIC_ROOT = S3_URL+'static/'
COMPRESS_STORAGE = STATICFILES_STORAGE
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
css url( "../ img / image.png")をCACHE /imgディレクトリにコピーするようにコンプレッサーに指示する設定が必要だと思いますか?