我正在将 django-compresor 用于部署在 heroku 上的应用程序,亚马逊 S3 提供静态文件。除了背景图像中引用的我的css中的图像之外,一切都工作正常: url() 没有使用正确的路径呈现。
我的静态文件按以下目录结构组织:
-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 和压缩器的新手,所以我不确定正确的行为应该是什么,但这似乎不正确。我看到它的方式,如果我可以让 django 压缩器执行以下两项操作之一,则可以解决问题: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')
设置.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 目录?