ValueError: 找不到文件 <pipeline.storage.PipelineCachedStorage 对象>

4 投票
1 回答
4429 浏览
提问于 2025-04-18 04:21

我正在尝试在 Django 1.6.3 上使用 django pipeline 来编译 SASS 和压缩 CSS 文件,但在访问我的网站后出现了以下错误:

ValueError: 找不到文件 'css/test2.css',在 <pipeline.storage.PipelineCachedStorage object at 0x0585DF50> 中。

我按照 readthedocs.org 上的指南配置了 pipeline:我把 pipeline 加入了 INSTALLED_APPS,然后定义了 STATIC_URLSTATIC_ROOT

STATIC_URL = '/test/forum/skins/default/media/'
STATIC_ROOT = '/test/forum/skins/default/media/'

文件夹结构:

  • test
    • forum
      • skins
        • default
          • media(静态文件)
            • css
            • js
            • images
        • site1
        • site2
        • site3
  • views
  • utils
  • settings.py

我把 SASSCompiler 加入了 PIPELINE_COMPILERS,然后添加了要压缩的文件路径:

# pipeline settings
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
PIPELINE_COMPILERS = (
  'pipeline.compilers.sass.SASSCompiler',
)
PIPELINE_CSS = {
    'main': {
        'source_filenames': (
          'css/test.scss',
        ),
        'output_filename': 'css/test2.css',
    },
}

最后,我把 CSS 链接到了我的 XHTML 索引:

{% load compressed %}
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        {% compressed_css 'main' %}
    </head>

我不明白我哪里做错了。 谢谢任何帮助!


更新:

当我运行 collectstatic 时,它复制的是 django 的文件,而不是我项目里的文件。

F:\DEV\DJANGO\apps\test>python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings:

    F:\test\forum\skins\default\media

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes
Copying 'F:\DEV\DJANGO\apps\django\django\contrib\admin\static\admin\css\base.
css'
Copying 'F:\DEV\DJANGO\apps\django\django\contrib\admin\static\admin\css\chang
elists.css'
Copying 'F:\DEV\DJANGO\apps\django\django\contrib\admin\static\admin\css\dashb
oard.css'
Copying 'F:\DEV\DJANGO\apps\django\django\contrib\admin\static\admin\css\forms
.css'
Copying 'F:\DEV\DJANGO\apps\django\django\contrib\admin\static\admin\css\ie.cs
s'
[etc .... ]

但是路径 F:\test\forum\skins\default\media 是错误的,我的项目实际上位于 F:\DEV\DJANGO\apps\test\forum\skins\default\media

然后我尝试查找静态文件:

F:\DEV\DJANGO\apps\test> python manage.py findstatic css/main.css

No matching file found for 'css/main.css'.

但这个文件是存在的。

1 个回答

7

在Django的settings.py文件中,STATIC_ROOT这个变量告诉Django要把你的静态文件放到哪里,而STATIC_URL是用户在浏览器中看到的文件访问路径。你可以查看Django关于静态文件的文档了解更多信息:

https://docs.djangoproject.com/en/dev/ref/settings/#static-files

举个例子,假设你的settings.py文件里有以下内容:

STATIC_ROOT = "/var/www/example.com/static/"
STATIC_URL = "/static/"

现在,假设你在/home/fuiba/git/your-django-project/这个目录下进行软件开发。在你的Django项目里,有一个叫做static的子目录,里面有一个文件叫custom.css。这个文件的完整路径是:

`/home/fuiba/git/your-django-project/static/custom.css`

接下来,在你运行python manage.py collectstatic命令后,你的样式表文件会被移动到STATIC_ROOT目录里。然后你启动了web服务器,可以通过项目的STATIC_URL来访问这个静态文件。假设你在本地的8000端口上运行web服务器,你可以在浏览器中通过以下地址访问样式表:

http://localhost:8000/static/custom.css

好的,这就是它的基本工作原理。在你的情况下,你似乎是在Windows系统下开发,所以有一些注意事项。首先,路径中不要使用反斜杠('\'),只用正斜杠。同时,你仍然需要指定驱动器字母和冒号。所以,我们把你的STATIC_ROOT设置为:

STATIC_ROOT = "F:/DEV/DJANGO/apps/test-static-root/"

我这样选择是为了不让你的测试项目目录变得杂乱,并且在上面的路径下应该创建一个兄弟目录,里面放你的静态文件。

告诉我你的进展,我会尽量提供更多的细节。

祝你好运!

撰写回答