压缩器:带有相对于文件夹的路径的CSS图像
我正在使用django-compresor为部署在heroku上的应用程序提供服务的静态文件。 一切工作正常,除了在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和压缩机的新手,所以我不确定什么是正确的行为应该是,但这似乎并不正确。 我看到它的方式,如果我可以让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')
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目录中?
我遇到过同样的问题!
对我来说,它首先看起来好像是压缩机的问题。 我从前缀改变了我的前缀S3Storage后端
StaticS3Backend = lambda: S3BotoStorage(location='static')
至
class StaticS3Backend(S3BotoStorage):
location = 'static'
因为另一种方法没有设置正确的位置值(它保持空白)
这解决了我的问题。
我还没有找到任何好的解决方案。 这里有一些很好的讨论https://github.com/jezdez/django_compressor/issues/226
在您的CSS文件中,使用指向Amazon S3上的图像url的绝对路径将使其工作。 但不用说,这是愚蠢的。 为什么我希望我的本地开发和测试环境都使用prod的图像? 有时候,这是不可接受的。 假设你想改变图像并测试一段时间。 (您可以手动将新图片上传到s3,并手动将所有数千个对这个图片的css引用更改为新的url。再次,愚蠢。)
稍微好一点的方法是在你的CSS中使用{{STATIC_URL}}来构建绝对路径,而不是相对路径。 是的,如果您在此处添加了compressor.filters.template.TemplateFilter,则可以使用{{STATIC_URL}} https://django_compressor.readthedocs.org/en/1.3/settings/#base-settings。 这解决了多阶段问题。 但是,它不适用于本地开发,因为您不在这里进行压缩,如果这样做,您将很难进行调试。
我个人觉得django-compressor里面的compressor.filters.template.TemplateFilter是错误的。 它应该是django的一部分。 一个可选的过程,您可以打开的CSS和JS。
我最近碰到了这个,并通过设置COMPRESS_OUTPUT_DIR = ''
来解决它。 这导致压缩文件保存在静态根目录下,而不是静态的默认“CACHE”目录。