在压缩生产服务器上的django静态文件时,我们突然开始遇到此问题.Ubuntu 16.04,Python 3.x,Django 1.11.我正在使用ansible-playbook进行部署.
错误如下:
CommandError: An error occurred during rendering /chalktalk/app/chalktalk-react-40/chalktalk-react-40/chalktalk/apps/exams/templates/exams/section-edit.html: Invalid input of type: 'CacheKey'. Convert to a byte, string or number first.
它似乎不是一个静态文件中的问题,而是一个普遍的问题.每次运行它时,我们都会得到一个不同的文件.
我正在寻找谷歌上的任何线索,并没有出现相同的错误.
这是场景:
我正在运行Django 1.3.1,使用静态文件和django-compressor(最新稳定版)来编译LESS文件.
我有一个"资产"目录,它挂在静态文件中STATICFILES_DIRS(对于项目范围的静态资源).在那个目录中,我有一个"css"目录,其中包含一个包含LESS变量和mixins的"lib.less"文件.
所以物理路径是<project_root>/assets/css/lib.less,它服务于/static/css/lib.less.
在我的一个应用程序的静态目录中,我有另一个LESS文件,需要导入上面的那个.它的物理路径是<project_root>/myapp/static/myapp/css/file.less,它将服务于/static/myapp/css/file.less.
我的第一个想法是:
@import "../../css/lib.less"
Run Code Online (Sandbox Code Playgroud)
(即,基于URL,从上升到水平/static/myapp/css来/static/,然后遍历下入/static/css/lib.less).
但是,这不起作用,我已经尝试了几乎我能想到的URL和物理路径的所有组合,并且所有这些组合都FilterError在模板中给我,因为无法找到要导入的文件.
任何人都有任何想法,实际的导入路径应该是什么?
我在一块css文件的开发中尝试使用Django Compressor.我首先将{%compress%}标签放在一个文件周围,生成f6527e81a37c.css.然后我在标签之间添加了两个css文件,但是没有一个缩小的文件,这导致了2个缩小的文件:f6527e81a37c.css和ee906624f953.css.
最后,我想将所有css块连接并压缩成一个缩小的文件,但是将更多文件移动到压缩标签中似乎不会重新生成与css文件关联的密钥,即它仍然压缩成多个css文件即使它们被包裹在相同的{%compress%}块中.
我尝试清除Django的memcache,删除Compressor生成的/ static/CACHE /目录,并使用Django Compressor附带的压缩管理命令,但是当我运行dev环境时,我仍然得到多个压缩的css文件.我可以做一些刷新,以便Django Compressor重新生成与{%compress%}块中的文件相关联的css密钥吗?Compressor必须存储先前压缩文件密钥的位置.
压缩的结果:
<link rel="stylesheet" href="/static/CACHE/css/f6527e81a37c.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="/static/CACHE/css/ee906624f953.css" type="text/css" />
<link rel="stylesheet" href="/static/CACHE/css/7147db857125.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="/static/CACHE/css/043e7d82b775.css" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
settings.py:
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#other
'compressor.finders.CompressorFinder',
)
COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True
COMPRESS_CSS_FILTERS = [
#creates absolute urls from relative ones
'compressor.filters.css_default.CssAbsoluteFilter',
#css minimizer
'compressor.filters.cssmin.CSSMinFilter'
]
COMPRESS_JS_FILTERS = [
'compressor.filters.jsmin.JSMinFilter'
]
Run Code Online (Sandbox Code Playgroud) 我在heroku上使用django-compressor和amazon s3提供静态文件,并且我一直遇到以下错误,压缩器生成了静态文件的链接.我对压缩机和s3完全不熟悉:
https://xxx.s3.amazonaws.com/static/CACHE/css/989a3bfc8147.css?Signature=tBJBLUAWoA2xjGlFOIu8r3SPI5k%3D&Expires=1365267213&AWSAccessKeyId=AKIAJCWU6JPFNTTJ77IQ
<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>FE4625EF498A9588</RequestId>
<Expires>2013-04-06T16:53:33Z</Expires>
<HostId>Fbjlk4eigroefpAsW0a533NOHgfQBG+WFRTJ392v2k2/zuG8RraifYIppLyTueFu</HostId>
<ServerTime>2013-04-06T17:04:41Z</ServerTime>
</Error>
Run Code Online (Sandbox Code Playgroud)
我配置了两个heroku服务器,一个用于暂存,一个用于生产.他们每个人都有自己的数据库和s3桶.它们还共享相同的设置文件,所有唯一设置都配置为环境变量.我已经检查过静态文件实际上被推送到各自的存储桶.
压缩机和s3设置如下:
COMPRESS_ENABLED = True
COMPRESS_STORAGE = STATICFILES_STORAGE
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_OFFLINE = False
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')
Run Code Online (Sandbox Code Playgroud)
每次我在升级或生产时将更新推送到heroku时,我最终遇到了上述问题.有时它发生在一小时后,有时一天,有时一周,有时一旦更新被推出.奇怪的是,如果我将相同的更新推送到两个环境,一个将工作,我将在另一个上得到错误,或者它们将首先工作,一个将在一小时后到期,另一个将在一周内到期.
如果有人能解释发生了什么,我真的很感激.显然,Expires参数会导致问题,但为什么持续时间会随着每次推送而变化,以及什么决定了时间量?你如何改变过期时间?如果您需要更多信息,请与我们联系.
更新:我通过设置AWS_QUERYSTRING_AUTH = False暂时解决了这个问题.似乎没有任何方法可以在查询字符串中设置EXPIRATION TIME,仅在请求标头中使用.
我正在使用Amazon S3存储桶来存储我的静态文件.我在Django中有压缩器应用程序来压缩所有静态文件.Django给了我错误:
'home_page/css/bootstrap.min.css'无法通过COMPRESS_URL(' https://alphagravel.s3.amazonaws.com/static/ ')访问,无法压缩
同样你可以在这里查看:http://52.5.32.9/
但是:URL - ' https://alphagravel.s3.amazonaws.com/static/home_page/css/bootstrap.min.css '是可访问的
这是我的setting.py快照"""
INSTALLED_APPS = (
...
'storages',
'compressor',
'...
)
AWS_ACCESS_KEY_ID = '****'
AWS_SECRET_ACCESS_KEY = '***********'
AWS_QUERYSTRING_AUTH = False
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'alphagravel'
AWS_PRELOAD_METADATA = True
STATIC_URL = 'https://alphagravel.s3.amazonaws.com/static/'
ADMIN_MEDIA_PREFIX = 'https://s3-us-west-2.amazonaws.com/alphagravel/admin/'
COMPRESS_ROOT = STATIC_URL
COMPRESS_URL = STATIC_URL
COMPRESS_STORAGE = STATICFILES_STORAGE
COMPRESS_ENABLED = True
COMPRESS_OFFLINE_MANIFEST = "manifest.json" # Is created in CACHE directory
COMPRESS_PARSER = 'compressor.parser.HtmlParser'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么压缩器URL无法找到静态文件进行压缩.以及如何解决错误. …
我希望有人看到这个 -
我正在运行django-compressor,利用lessc设置来渲染/压缩文件中的CSS.它从开发服务器调用时效果很好,但是当在apache + mod_wsgi下运行时,它始终返回错误.
为了调试这个,我运行了过滤器调用的确切命令作为www-data用户(在WSGIDaemonProcess指令中被定义为wsgi用户)并验证它是否正常工作,包括读取和写入文件的权限它正在操纵.
我还攻击了该系统上压缩器/ filters/base.py中的django压缩器代码,似乎尝试调用的任何命令在proc.communicate()调用后得到的返回码为-6.
我希望有人之前看过这个 - 或者说它响了一些铃声.它在apache + mod_wsgi进程之外的这台机器上运行正常(即作为开发服务器运行进程).我只是不清楚可能阻塞subprocess.Popen()调用的内容.
我很难理解django-compressor的使用.
这是我想要完成的事情:
我想将我的LESS CSS和Coffeescript文件分成资产目录
例如
app
??? assets
??? coffee
? ??? script.coffee
??? less
??? style.less
Run Code Online (Sandbox Code Playgroud)
将静态资产(如图像)保留在静态目录中
例如
app
??? static
??? hello.txt
??? photo.jpg
Run Code Online (Sandbox Code Playgroud)
为此,我已将资源路径添加到我的STATICFILES_DIRS变量,以允许django-compressor查找文件(按预期工作).这是正确的方法吗?我一直试图找到一个专用于django-compressor的独立加载路径,但没有任何运气,因为我不打算将这些资产用作静态.
为了部署到生产,我希望将编译好的CSS和JS文件以及我的app/static目录中的其他媒体(例如图像等)收集到app/static-prod目录中.但这并不是很好,因为在使用collectstatic命令时也会收集资产.
例如
(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ ./manage.py collectstatic --noinput
Copying '/home/fots/django_learning/app/assets/less/style.less'
Copying '/home/fots/django_learning/app/assets/less/import.less'
Copying '/home/fots/django_learning/app/assets/coffee/script.coffee'
Copying '/home/fots/django_learning/app/static/photo.jpg'
Copying '/home/fots/django_learning/app/static/hello.txt'
5 static files copied.
Run Code Online (Sandbox Code Playgroud)
使用该./manage.py compress命令只需要记录我编译的文件,而不是本例中的photo.jpg或hello.txt.
我发现这样做的唯一可行方法是使用带有collectstatic的--ignore标志
例如
(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ ./manage.py collectstatic --noinput --ignore=less --ignore=coffee
Copying '/home/fots/django_learning/app/static/photo.jpg'
Copying '/home/fots/django_learning/app/static/hello.txt'
2 static files copied.
Run Code Online (Sandbox Code Playgroud)
我也搞乱了COMPRESS_ROOT和COMPRESS_URL配置变量,但这些只会造成进一步的麻烦.更改COMPRESS_ROOT可解决collectstatic问题,但现在使用compress命令时,生成的文件最终位于静态文件的不同位置.
这些解决方案似乎并不优雅 有一个更好的方法吗?我觉得我错过了什么.
在此先感谢任何帮助:)
我使用django-compresor作为部署在heroku上的应用程序,亚马逊S3提供静态文件.一切都工作正常,除了我在背景图像中引用的css中的图像:url()没有使用正确的路径呈现.
我的静态文件按以下目录结构组织:
-static
-myapp
-js
-css
-img
-bootstrap
-js
-css
-img
-othervendor
-js
-css
-img
Run Code Online (Sandbox Code Playgroud)
因此,我在url()中使用的路径是相对于css文件的:
url("../img/icon.png")
Run Code Online (Sandbox Code Playgroud)
我的所有css文件都被压缩并移动到我的静态目录中的CACHE文件夹中,并且CACHE目录的url正确呈现为:
https://mybucket.s3.amazonaws.com/static/CACHE/css/somehash.css
Run Code Online (Sandbox Code Playgroud)
问题是css文件url()中的图像呈现为:
https://mybucket.s3.amazonaws.com/static/CACHE/img/imagefile.png
Run Code Online (Sandbox Code Playgroud)
它应该是:
https://mybucket.s3.amazonaws.com/static/myapp/img/imagefile.png
Run Code Online (Sandbox Code Playgroud)
或者如果图像被复制到CACHE目录,这将起作用:
https://mybucket.s3.amazonaws.com/static/CACHE/img/imagefile.png
Run Code Online (Sandbox Code Playgroud)
我的临时修复是将我的CSS中的图像路径更改为以下内容并且它有效:
url("/static/foldername/img/icon.png")
Run Code Online (Sandbox Code Playgroud)
我是django和压缩机的新手,所以我不确定应该是什么样的正确行为,但这似乎不正确.我看到它的方式,问题可以是固定的,如果我能得到的Django压缩机做两件事情:1)复制)在CSS的url(引用的所有图像到CASHE/IMG目录或2)使所代表的正确网址../这是我的设置:
我的模板中的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')
Run Code Online (Sandbox Code Playgroud)
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 = …Run Code Online (Sandbox Code Playgroud) 在我的压缩器设置中,我在大多数javascript中使用SlimIt:
COMPRESS_JS_FILTERS = ['compressor.filters.jsmin.SlimItFilter', ]
我的一些js文件不应该通过SlimIt,因为文件已经缩小,或者当javascript与其他文件缩小时会抛出一些错误.我的模板块最终看起来像这样:
{# code that I minify #}
{% block compressed_libs %}
{% compress js %}
<script src="/static/js/compress_this.js"></script>
<script src="/static/js/also_compress_this.js"></script>
...
{% endcompress %}
{% endblock %}
{# code that shouldn't minify #}
{% block non-compressible_libs %}
<script src="/static/js/already.min.js"></script>
<script src="/static/js/breaks-everything.js"></script>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我可以为不同的块/文件设置不同的压缩过滤器规则,以便在跳过SlimIt时我的"不可压缩"文件仍然可以通过压缩器连接在一起吗?
我正在尝试使用cmd创建一个超级用户,但每次我运行命令时我都会:
C:\Users\PCDOM\Desktop\Power\pm_app>python manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 17, in <module>
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line
338, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line
312, in execute
django.setup()
File "C:\Python27\lib\site-packages\django\__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Python27\lib\site-packages\django\apps\registry.py", line 85, in popu
late
app_config = AppConfig.create(entry)
File "C:\Python27\lib\site-packages\django\apps\config.py", line 86, in create
module = import_module(entry)
File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named compressor
Run Code Online (Sandbox Code Playgroud)
即使我在我的虚拟环境和settings.py中安装了它:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
#'bootstrap3',
'promo', …Run Code Online (Sandbox Code Playgroud)