如何在运行Django collectstatic时忽略目录?

35 投票
3 回答
15655 浏览
提问于 2025-04-17 07:03

我正在用 Django 1.3、Ubuntu 11.10、gunicorn 和 Nginx 进行一个小测试项目,所有东西都在一个虚拟环境中。现在我在运行 collectstatic 命令,把我的静态文件放到 Nginx 提供服务的目录里。

为了简单起见,假设我的静态文件目录是 /home/user/static,而我的项目在 /home/user/project。

当我进入 /home/user/project 目录时,我运行:

python manage.py collectstatic --noinput

这个命令可以正确地把我安装的所有应用的静态文件复制过来。不幸的是,它也把 Django 管理后台的文件复制过来了,而我想跳过这些文件。

我查看了 collectstatic 的文档,发现有一个 -i (--ignore) 参数,可以用来忽略某些文件。我尝试了不同的命令变体,因为我不确定这个忽略模式是指我的 /home/user/static 目录,还是指原来的应用目录。

这里有一些我尝试过但没有成功的例子:

python manage.py collectstatic --noinput -i /home/user/static/admin
python manage.py collectstatic --noinput -i /home/user/static/admin/*
python manage.py collectstatic --noinput -i /home/user/static/a*
python manage.py collectstatic --noinput -i /home/alexis/.virtualenvs/django13/*
python manage.py collectstatic --noinput -i /home/user/.virtualenvs/django13/lib/python2.7/site-packages/django/contrib/admin*

我发现如果我从 /home/user/static/admin 创建一个符号链接到 /home/user/.virtualenvs/django13/lib/python2.7/site-packages/django/contrib/admin/media,collectstatic 就会注意到并跳过这些文件的复制。不过,我还是想让 --ignore 选项正常工作。

我漏掉了什么呢?

谢谢你的帮助!

3 个回答

-1

我有一个这样的文件夹结构:

my_project
└─content
| └─static
|   └─content
|     ├─css
|     ├─dist
|     ├─js
|     ├─scss

我想排除掉 scss 文件夹以及里面的所有文件。

下面是我尝试过的所有方法的记录。

以下是一些有效的命令:

"python manage.py collectstatic --no-input --ignore /content/static/content/scss"
"python manage.py collectstatic --no-input --ignore /content/static/content/scss/"
"python manage.py collectstatic --no-input --ignore /content/static/content/scss/*"
"python manage.py collectstatic --no-input --ignore content/static/content/scss"
"python manage.py collectstatic --no-input --ignore content/static/content/scss/"
"python manage.py collectstatic --no-input --ignore content/static/content/scss/*"
"python manage.py collectstatic --no-input --ignore /content/scss"
"python manage.py collectstatic --no-input --ignore /content/scss/"
"python manage.py collectstatic --no-input --ignore /content/scss/*"
"python manage.py collectstatic --no-input --ignore content/scss"
"python manage.py collectstatic --no-input --ignore content/scss/"

以下是一些有效的命令:

"python manage.py collectstatic --no-input --ignore content/scss/*" <- best
"python manage.py collectstatic --no-input --ignore content/scss*"

理解这一点的关键是要读十遍这句话:

你需要从静态目录找到路径,而不是从项目根目录。

来源

总结一下:

  • 路径开头不需要斜杠
  • 路径是相对于你的静态目录的
12

Django 2.2 的更新终于解决了一个很久以来的问题,那就是在路径匹配时可以指定忽略的参数。例如,

manage.py collectstatic --ignore /vendor/*.js

这样就可以正常工作了。

44

不要写目录的完整路径。比如说,使用方法如下:

python manage.py collectstatic --noinput -i admin

这个命令不会把 admin/ 目录复制到 STATIC_ROOT 路径下。

撰写回答